# para guardar ggplot con tamaño
# ggsave("facet_wrap_chart.png", facet_wrap_chart, width = 1680/72, height = 1050/72, dpi = 72)

Funciones de conversión

# Funciones de conversión para crudo
## Metro cubico a barril (_p = precio, _q = cantidad)
conversor_m3bbl_p <- function(x) {x / 6.2898}
conversor_m3bbl_q <- function(x) {x * 6.2898}

# Funciones de conversión para gas
## Pies cúbico a metro cúbico
## 1ft³= 0.02831685m³
conversor_ft3m3_p <- function(x) {x / 0.02831685}
conversor_ft3m3_q <- function(x) {x * 0.02831685}

## Pie cúbico a Millón de BTU
# 1 ft3 =  0.001028 MM BTU
conversor_ft3MMBTU_q <- function(x) {x * 0.001028}
conversor_ft3MMBTU_p <- function(x) {x / 0.001028}

## Millón de BTU a metro cúbico
## 1 MM Btu =  27,8 m3 de gas (IAPG) ó 28.32861 m3 (Canada Energy Regulator)  
conversor_MMBTUm3gas_p <- function(x) {x / 28.32861}
  
## m3 a  MMBTU de gas
# 1 m3 = 0.0353 MM BTU  (Canada Energy Regulator)
# otra opción 1 m3 = 34.121 MM BTU  (BP)
conversor_m3MMBTU_q <- function(x){x * 0.0353}
conversor_m3MMBTU_p <- function(x){x / 0.0353}

## m3 a  MMBTU (Alternativa, revisar)
# conversor_m3MMBTU_q <- function(x){x * 1/27.8}
# conversor_m3MMBTU_p <- function(x){x / 1/27.8}

## Conversión a BEP desde distintas medidas
conversor_m3bep_q <- function(x) {x * 5883}
conversor_MMBTUbep_q <- function(x) {x * 0.17245496} # BP
conversor_MMBTUbep_p <- function(x) {x / 0.17245496}
conversor_bepMMBTU_p <- function(x) {x / 5.798615}

Variables

Producción

Fuentes:

Producción de Crudo

poner en cuanto no coincide, cuanto esta por encima o por debajo, brecha, explicar en qué año se hace el empalme en los precios

La producción de petróleo crudo de largo plazo proviene del Anuario de Combustibles, de la cual contamos datos desde 1911 hasta 1992. Sus valores para el período 1980-1992 coinciden con los de EIA, por lo cual pueden usarse como fuentes alternativas. Asimismo, la evolución de SESCO es similar a la de EIA, salvo por pequeñas divergencias entre 2008 y 2013. La serie de Regalías presenta un nivel menor que las anteriores debido a las deducciones de producción que realizan las empresas para pagar un menor nivel de Regalías hacia las provincias donde realizan la producción. Por último, la serie del Ministerio de Economía coincide con Regalías en sus primeros años, luego presenta un nivel intermedio entre Regalías y SESCO y a partir de 2009 toma a SESCO como fuente. Salvo el Anuario de Combustibles, el resto de las series presentan datos hasta los últimos años. Por lo tanto, el criterio de selección para la serie de producción con la que se realizarán los cálculos es el siguiente:

  • Criterio de cómputo para producicón de crudo:
    • 1911 a 1992: Anuario de combustibles
    • 1993 - actualidad: SESCO Downstream


Tabla 1. Producción de petróleo crudo en Argentina según distintas fuentes (barriles)

Producción de Gas Natural

Al igual que en la producción de petróleo crudo, la serie de largo plazo de producción de gas proviene del Anuario de Combustibles, de la cual contamos datos desde 1913 hasta 1992. A diferencia del crudo, sus valores para el período 1980-1992 no coinciden con los de EIA, pero está última sí coincide con los de Regalías entre 1999 y 2015. En cambio, la serie de SESCO, tiende a continuar la evolución de EIA y Regalías, pero con el nivel del Anuario de Combustibles, por lo que ambos pares de series pueden empalmar coherentemente según su nivel. Nuevamente, los valores de la base de Regalías son menores debido a las deducciones de producción para tributar menos regalías. La serie del Ministerio de Economía toma los valores de SESCO.Por lo tanto, el criterio de selección para la serie de producción de gas para los cálculos es el siguiente:

  • Criterio de cómputo de la producción de gas:
    • 1911 a 1992: Anuario de combustibles
    • 1993 en adelante: SESCO Downstream
Registered S3 method overwritten by 'GGally':
  method from   
  +.gg   ggplot2


Tabla 2. Producción de gas natural en Argentina según distintas fuentes (MMBTU)

Produccion total

produccion_total <- prod_merge_gas_bep %>% 
  select(anio, unidad,prod_gas) %>%
  left_join(prod_merge_crudo %>% 
              select(anio, unidad,prod_crudo) %>%  mutate(unidad ="BEP") ) %>% 
  mutate(produccion_total_bep = prod_crudo + prod_gas)
Joining, by = c("anio", "unidad")
produccion_total

Precio Mercado Interno

Fuentes:

  • Base Ministerio de Hacienda, Informes Sectoriales
  • Secretaría de Energía-Regalias
    • Por ausencia de información, el precio de regalias entre 1993 y 1998 es el precio total (es decir, es un ponderado que incluye también el precio del mercado externo). En los años posteriores, dicho precio sí corresponde al del mercado interno.
  • Kozulj y Pistonesi. Revista del Instituto de Economía Energética (IDEE) - Fundación Bariloche (1970 - 1988). Precio oficial interno de la cuenca neuquina a tasa de cambio oficial. Las fuentes utilizadas de esta revista son Secretaria de Energía, YPF, Gas del Estado, Boletin Informativo de Techint y series propias de IDEE
  • Memoria Anual y balances contables de YPF (varios años). Precio intero promedio resultante de la relación entre ventas y cantidades producidas.
  • Precios anuario. FALTA BUSCAR

ver de donde sacan el TCC cambiar precio del 92 por mecon estimado y valores restantes por estimado de idee

Precio Mercado Interno de Crudo

  • Criterio para precio_crudo:
    • 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
    • 1989 a 1991: Anuario de YPF
    • 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
    • 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
    • 1993 en adelante: MECON


Tabla 3. Precio del mercado interno del petróleo crudo en Argentina según distintas fuentes (barriles)

Precio Mercado Interno de Gas Natural

  • Precio Mercado Interno de gas:
    • 1963 - 1969 & 1989 - 1992: Anuario de YPF
    • 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
    • 1993 en adelante: Secretaría de Energía - Base Regalías


Tabla 4. Precio del mercado interno del gas natural en Argentina según distintas fuentes (barriles)

Precios de Referencia del Mercado Mundial

Precios de exportación desde Argentina, benchmarks y Precios del mercado de EEUU (solo gas, internos y de expo/impo)

Precios de Referencia del Crudo

  • Fuentes seleccionadas para precio_me_crudo:
    • entre 1962 y 1992: precio de exportación argentina de UN Comtrade (clasificación SITC as reported)
    • entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
    • entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
    • 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
    • Valores faltantes previos a 1992 (1970 - 1985): Brent (Fuente: Inflation Data)

Falta construir una paridad de expo/impo con el flete

Precios de Referencia del Gas

  • Criterio de precio_externo_gas:
    • Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
    • 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
    • Datos faltantes para los años previos a 1963 y período 1968-1971
Exportación Argentina
Referencias mundiales
Bolivia
Todos los precios

buscamos un precio

cuanto es una cantidad de btu de gas al precio de referencia (ej bolivia) y cuanto es si convierto esos btu a barriles y los valorizo con el precio del barril? cuanto queda la unidad en btu si tomo el precio de petroleo y lo covierto a btu. es decir, cuanto es el valor si la valorizo en precio del petroleo

¿cuantos usd es un btu de petroleo? si tomo un barril de petroleo y lo convierto a btu ( me va a dar cuantos USD es un btu) luego comparo los USD/btu y lo comparo con el gas de bolivia

grinber: convierte todo el gas en petroleo y le pone el precio de petroeloe. subestima los precios del gas?

precio_crudo_vs_gas <- precio_mdomundial_gas_bep %>% 
  select(anio, unidad, precio_externo_gas) %>% 
  left_join(precios_referencia_y_expo_crudo %>% 
              select(-unidad) %>% 
              gather(key = tipo_precio_crudo,
                     value   = precio_crudo_usd_bbl,
                     2:ncol(.)), by ="anio") %>% 
  mutate(precio_crudo_sobre_gas =precio_crudo_usd_bbl/precio_externo_gas) %>% 
  filter(!(is.na(precio_crudo_sobre_gas)), 
         !(tipo_precio_crudo %in% c("wti_spot_price_fred", "precio_me_crudo"))  )
         # (tipo_precio_crudo %in% c("brent_iea"))  )
         # (tipo_precio_crudo %in% c("brent_iea", "brent_historic"))  )
precio_crudo_vs_gas

graf <-  precio_crudo_vs_gas %>% 
  ggplot(aes(anio, precio_crudo_sobre_gas, color=tipo_precio_crudo))+
  geom_line()+
  labs(title = "precio del crudo sobre el del gas (ambos en barriles)")

ggplotly(graf, width = 800, length=600)
# graf

# writexl::write_xlsx(precio_crudo_vs_gas, path= "precio del crudo vs gas.xlsx")  

Exportaciones e Importaciones

Exportaciones e Importaciones de Crudo

  • Exportaciones de Crudo:
    • 1962 a 1993: UN Comtrade
    • 1994 en adelante: SESCO Downstream
    • Los datos faltantes de SESCO se completaron con MECON
    • Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84

Exportaciones e Importaciones de Gas

  • Fuentes seleccionadas:
  • 1962 a 1996: UN Comtrade,
  • 1997 en adelante: SESCO Downstream
  • Datos faltantes para los años 1999 y 2000

Empleo, Remuneraciones y Masa Salarial (CCNN)

Pozos

Metros perforados

Fuente:

Pozos en operación

Fuentes:

  • Secretaría de Energía - Datos MINEM:
    • Listado de pozos cargados por empresas operadoras: se toma la variable “Fecha del Fin de terminación de perforación del pozo” (adjiv_fecha_fin_term) como año de puesta en producción del pozo. Se podría elaborar un stock de pozos a partir de acumular los pozos terminados y restando los pozos abandonados, agrupando con la variable “Fecha de abandono del pozo”(adjiv_fecha_abandono)
    • Pozos terminados
    • Capítulo IV
    • Estado de pozos (AUN NO SE PROCESÓ ESTA BASE NI LA ANTERIOR)
    • SESCO
  • IAPG. Se presentan dos series: una elaborada a partir de los pozos perforados por año (resultante de descargar una base por cada año del sitio web oficial) y otra que corresponde al stock de pozos de petróleo de extracción efectiva (procedente de los datos de Estadísticas del Centenario de IAPG).

ver relaciones * PBI hidrocarburos / PBI total (ver cual elegir) * corregir nuestro VBP depurando servicios * MIP’s coef tecnico (para ver CI en el sector petrolero y peso del sector petrolero en PBI)

  • stock petrolero / stock total JIC,EM
  • Stock extraccion = PPyE PAE + PPyE Tecp + PPyE Petrobras upstr + Activo YPF upstream
    • ver que porcentaje que representan estas empresas en la produccion o pozos y ver de ampliarlo
    • ver relacion Activo YPF upstream / PPyE integrada YPF
    • ver relacion ganancias AFIP y BOLSAR con el stock correspondiente (coherencia)
    • ver relacion con Coremberg
    • pasar ENGE

grinberg convertir lo nuestro a costos. agarrar nuestros valor y dividirlo por barriles (sumando gas en BOE) * costos por bbl, precio el barril y precio de produccion (sumo la gcia normal al costo1)

Activos

Pasar datos de bs de uso en yacimientos para armar relación activo yacimeinto/total

Fuentes:

  • Balances de Bolsar (unicamente empresas que cotizan en la bolsa de valores argentina). Revisar el stock del sector distribución porque se presenta demasiado grande con respecto al de los demás. Falta pasar los datos del activo de casi todas las empresas

  • AFIP. Con esta fuente no tenemos calculo de renta, sino que solo usamos la TG como parámetro. Nota: "_c" significa casos presentados de la variable correspondiente

  • Memorias de YPF. La década de los 80 presenta picos que hay que revisar

  • Calculo del Capital Total Adelantado (KTA)

    • Bolsar: Es equivalente a la suma de Propiedad, Planta y Equipos Neta (descontando los terrenos y obras en curso) y los Inventarios. Cuando los datos lo habilitan, se le agregó los salarios adelantados (salarios y cargas consumidos sobre rotación). Luego, cuando no se presentaron datos de Propiedad, Planta y Equipos, se tomó el activo no corriente.
    • AFIP: Es equivalente a la suma de Bienes de Uso, Bienes de Cambio, Inventarios y Disponibilidades.
    • Memoria YPF: Suma de Bienes de Uso y Bienes de Cambio

Stock total de la rama

Stock de segmentos de YPF y Petrobras

Stock por empresas

YPF largo plazo

Comparación entre la Memoria YPF (recopilado por BFR) y los balances extríados de Bolsar

Estimación de stock de capital a partir de la evolución de pozos perforados

El ejercicio consiste en verificar si los pozos terminados sirven como indicador de la inversión y, por lo tanto, de aproximador al stock de capital adelantado. Para ello se parte de un año base de la serie de Propiedad, Planta y Equipo del sector extracción de Bolsar y AFIP, para luego indexar las variables por la evolución de los pozos. Los balances de Bolsar que corresponden únicamente a extracción son dos: PAE y Tecpetrol, por lo que el valor obtenido puede estar subrepresentado para dar cuenta del total de la rama. Con respecto al índice de pozos, se tomaron dos series alternativas: una construída a partir del stock de pozos en extracción efectiva (fuente: IAPG) y otra elaborada con los pozos terminados anuales cargados por empresa operadora (fuente: Secretaría de Energía).

El año base elegido es 2006, dado que es el último dato que poseemos del stock de pozos totales en actividad de IAPG.

Se realizó la misma estimación para YPF, filtrando las variables de Propiedad, Planta y Equipo (para el total de la empresa, por lo que incluye no sólo extracción sino refinación y otros rubros) y activo total del upstream. Se utilizó únicamente el indice de pozos terminados anuales de YPF para estimar la PPyE y el activo, dado que no se posee valores del stock de pozos en perforación para los años en donde existen valores contables que sirvan de año base. Luego, se estimó un stock de capital total de rama a partir de ponderar el stock de YPF por la relación entre los pozos de YPF y los pozos totales de la rama.

En síntesis, el listado de variables estimadas- a partir de las dos series de pozos (stock y flujo),salvo para la estimación de YPF que solo se pudo hacer con flujo de pozos por ausencia de información- es las siguientes:

  • \(ppye\_estimado\_bolsar\) = \(PPyE\ año\ base\ de\ Bolsar\) * \(indice\ de\ pozos\)

  • \(ppye\_estimado\_afip\) = \(PPyE\ año\ base\ de\ AFIP\) * \(indice\ de\ pozos\)

  • \(ppye\_estimado\_ypf\) = \(PPyE\ año\ base\ de\ YPF\) * \(indice\ de\ pozos\ YPF\)

  • \(activo\_estimado\_upstream\_ypf\) = \(Activo\ año\ base\ de\ YPF\) * \(indice\ de\ pozos\ YPF\)

  • \(ppye\_estimado\_total\) = \(ppye\_estimado\_ypf\) * \[\frac{pozos\ totales}{pozos\ de\ YPF}\]

  • \(activo\_estimado\_upstream\) = \(activo\_estimado\_upstream\_ypf\) * \[\frac{pozos\ totales}{pozos\ de\ YPF}\]

Para poder seleccionar la estimación más adecuada, se realizó un análisis de correlación entre todas las series estimadas y los valores contables que se poseen de PPyE de AFIP, Bolsar e YPF. Se presentan distintos cuadros de correlaciones, con sus nivles de significancia, diagramas de dispersión entre variables y su distribución. Las series construídas que poseen mejor correlación son la Propiedad, Planta y Equipo a partir de Bolsar estimadas con índice de stock de pozos (correlación fuerte de 0.89 y significativa al 0.001) y flujo de pozos (correlación moderada de 0.54 y significativa al 0.05) y luego el activo del upstream total de la rama a partir de YPF (correlación moderada de 0.42 y significativa al 0.1 con los valores contables de YPF y correlación fuerte de 0.88 y significativa al 0.001 con las estimaciones de PPyE de AFIP y Bolsar a partir de flujo de pozos).

la estimación tiene que realizarse con PPyE porque hay que excluir salarios e inventarios (que están en KTA)

Análisis de correlacion entre Propiedad, Planta y Equipo y Pozos en producción

reemplazar ipc por un ibif o indice especifico

Total rama

                  ppye_afip ppye_bolsar pozos_iapg pozos_terminados pozos_cargados
ppye_afip         1.0000000   0.1743854 -0.2930975       -0.6054224     -0.3793896
ppye_bolsar       0.1743854   1.0000000 -0.4269400       -0.5803358     -0.3213849
pozos_iapg       -0.2930975  -0.4269400  1.0000000        0.8924037      0.9611781
pozos_terminados -0.6054224  -0.5803358  0.8924037        1.0000000      0.8696256
pozos_cargados   -0.3793896  -0.3213849  0.9611781        0.8696256      1.0000000

#años base 2006
ppye_anio_base_bolsar <- (stock_rama %>% 
  filter(variable == "ppye" & sector == "produccion") %>%
  select(anio, unidad, ppye = valor))
ppye_anio_base_bolsar <- ppye_anio_base_bolsar$ppye[ppye_anio_base_bolsar$anio ==2006]

# valor_base <- serie[which(fecha==fecha_base)]

ppye_anio_base_afip <- (stock_rama %>% 
  filter(variable == "ppye" & sector == "extraccion_petroleo_gas") %>%
  select(anio, unidad, ppye = valor))
ppye_anio_base_afip <- ppye_anio_base_afip$ppye[ppye_anio_base_afip$anio == 2006]


stock_y_pozos <-  comparacion_pozos %>% 
  gather(key = fuente_pozo,
         value = cantidad_pozos,
         2:ncol(.)) %>%
  arrange(fuente_pozo,anio) %>% 
  group_by(fuente_pozo) %>% 
  mutate(indice_pozos_06 = generar_indice(serie= cantidad_pozos ,
                                        fecha = anio,
                                        fecha_base = 2006)) %>% 
  # left_join(stock_rama %>%  
  #             filter(variable == "ppye" & sector %in% c("extraccion_petroleo_gas", "produccion")) %>%
  #             select(anio, ppye = valor, fuente_stock = fuente), by = "anio") %>% 
  mutate(ppye_afip = ppye_anio_base_afip * indice_pozos_06,
         ppye_bolsar =ppye_anio_base_bolsar * indice_pozos_06,
         unidad_ppye="Millones de pesos 2018") %>% 
  gather(key = fuente_ppye,
         value = ppye_estimado,
         5:6)
stock_y_pozos

ggplotly(stock_y_pozos %>% 
  filter(anio >1960) %>% 
  ggplot(aes(anio,ppye_estimado , color = fuente_pozo))+
  geom_line()+
  labs(y= "Millones de pesos de 2018")+
  facet_wrap(~fuente_ppye    ),
    width = 800, length =500)

#stock estimado a partir de pozos
stock_estimado <- stock_y_pozos %>% 
  ungroup() %>% 
  filter(fuente_pozo =="pozos_cargados_sec_energia", fuente_ppye =="ppye_bolsar") %>% 
  rename(unidad = unidad_ppye, valor =ppye_estimado) %>% 
  select(-c(cantidad_pozos, indice_pozos_06, fuente_pozo))


#diferencia entre ppye estimada y valor contable de bolsar
stock_estimado %>% 
  left_join(stock_rama %>% 
              filter(fuente=="Bolsar", variable =="ppye", sector == "produccion") %>% 
              select(anio, unidad, ppye_bolsar = valor)) %>% 
  na.omit() %>% 
  mutate(diff = (valor/ppye_bolsar -1)*100)
Joining, by = c("anio", "unidad")
#cambio stock solo para los años que tenemos BOLSAR
stock_estimado <- stock_rama %>% 
              filter(fuente=="Bolsar", variable =="ppye", sector == "produccion") %>% 
              select(anio, unidad,fuente_ppye=fuente , valor)
  
  
Stock de pozos
stock_y_pozos_tasas_v2 <- stock_rama %>% 
  filter(variable == "ppye" & sector %in% c("extraccion_petroleo_gas", "produccion")) %>%
  select(anio, valor,fuente) %>%
  spread(key = fuente, value = valor) %>% 
  full_join(pozos_iapg_centenario%>%
            select(anio, pozos_iapg = totales ), by = "anio") %>%
  rename(ppye_afip = AFIP,
         ppye_bolsar = Bolsar ) %>% 
  arrange(anio) %>%
  filter(anio > 1998) %>%
  select(-anio) %>%
  mutate_all(tasa_crecimiento)  
  


GGally::ggpairs(stock_y_pozos_tasas_v2, lower = list(continuous = "smooth"))

plot(stock_y_pozos_tasas_v2)


# round(var(stock_y_pozos_tasas, na.rm = TRUE), 4)
             ppye_afip ppye_bolsar pozos_iapg
ppye_afip    1.0000000   0.8382675 -0.9152596
ppye_bolsar  0.8382675   1.0000000 -0.9096424
pozos_iapg  -0.9152596  -0.9096424  1.0000000

YPF
ppye_ypf <- ypf_seg %>% 
  filter(sector  == "upstream" ) %>% 
  mutate(anio = year(fecha)) %>% 
  left_join(ipc_promedio %>% 
              select(anio, ipc_18), by = "anio") %>% 
  mutate(variable = "activo_upstream_ypf",
         activos = activos/ipc_18,
         unidad = "Millones de pesos 2018")%>% 
  select(anio, empresa, unidad ,  activo_upstream= activos) %>% 
  left_join(stock_balances_empresas %>% 
    ungroup() %>% 
    filter(variable == "ppye" & empresa == "YPF") %>%
    select(anio, empresa, unidad, ppye_integrada =valor) , by = c("anio", "empresa", "unidad")) %>% 
  mutate(activo_upstream = variacion_interanual(activo_upstream),
         ppye_integrada = variacion_interanual(ppye_integrada)) %>% 
  full_join(listado_pozos %>%
              select(-empresa) %>% 
              ungroup() %>% 
              filter(idempresa == "YPF") %>% 
              rename(anio = anio_terminacion_pozo, empresa = idempresa), by = c("anio", "empresa") ) %>% 
  arrange(anio)
ppye_ypf

ppye_ypf_tasas <- ppye_ypf %>%
   arrange(anio) %>%
  filter(anio %in% 1998:2018) %>%
  select(-c(anio, empresa, unidad)) %>%
  mutate_all(tasa_crecimiento)

#matriz de correlacion
cor_pozos_ypf <- cor(ppye_ypf_tasas, use = "complete.obs")
cor_pozos_ypf
                activo_upstream ppye_integrada      pozos
activo_upstream       1.0000000     0.22492855 0.51192183
ppye_integrada        0.2249285     1.00000000 0.06456351
pozos                 0.5119218     0.06456351 1.00000000
#  distintos correlogramas
#con ggcorrplot
p.mat = cor_pmat(cor_pozos_ypf)
ggcorrplot(cor_pozos_ypf, hc.order = TRUE,
    type = "lower", p.mat = p.mat, lab = T)


GGally::ggpairs(ppye_ypf_tasas, lower = list(continuous = "smooth"))

plot(ppye_ypf_tasas)

#años bases
anio_base_ypf_segmento <-   ppye_ypf$activo_upstream[ppye_ypf$anio == 2006]

anio_base_ypf_bolsar <- ppye_ypf$ppye_integrada[ppye_ypf$anio == 2006]


stock_y_pozos_ypf <-  ppye_ypf %>% 
  mutate(indice_pozos_06 = generar_indice(serie= pozos ,
                                        fecha = anio,
                                        fecha_base = 2006)) %>% 
  mutate(ppye_ypf_estimado = anio_base_ypf_bolsar * indice_pozos_06,
         activo_ypf_estimado =anio_base_ypf_segmento * indice_pozos_06,
         unidad_ppye="Millones de pesos 2018")

stock_y_pozos_ypf %>%
           select(anio, unidad = unidad_ppye, ppye_ypf_estimado, activo_ypf_estimado) %>%
           gather(key = estimacion,
                   value = valor, 
                   3:4) %>% 
           filter(anio >1960) %>% 
  ggplot(aes(anio,valor , color = estimacion))+
  geom_line()+
  labs(y= "Millones de pesos de 2018", title = "Estimacion de Activo usptream y PPyE de YPF a partir de indice de pozos")

PPyE y activo upstream total rama a partir de YPF
pozos_yfp_sobre_total <- listado_pozos %>%
  rename(anio = anio_terminacion_pozo) %>% 
  group_by(anio) %>% 
  summarise(pozos_cargados_sec_energia = sum(pozos, na.rm = T)) %>% 
  left_join(listado_pozos %>%
              rename(anio = anio_terminacion_pozo) %>% 
              filter(idempresa == "YPF") %>% 
              group_by(anio, idempresa) %>% 
              summarise(pozos_cargados_ypf = sum(pozos, na.rm = T))) %>% 
  mutate(ypf_sobre_total = pozos_cargados_ypf/pozos_cargados_sec_energia)
`summarise()` has grouped output by 'anio'. You can override using the `.groups` argument.
Joining, by = "anio"
# pozos_yfp_sobre_total

estimacion_ppye_total_via_ypf <- stock_y_pozos_ypf %>% 
  select(anio, unidad = unidad_ppye, ppye_ypf_estimado, activo_ypf_estimado) %>% 
  gather(key = estimacion,
         value = valor, 
         3:4) %>% 
  left_join(pozos_yfp_sobre_total %>% 
              select(anio, ypf_sobre_total)) %>% 
  mutate(valor = valor/ypf_sobre_total,
          estimacion = case_when(estimacion == "ppye_ypf_estimado" ~ "ppye_estimado_total",
                                 estimacion == "activo_ypf_estimado" ~ "activo_estimado_upstream" ))
Joining, by = "anio"
  
estimacion_ppye_total_via_ypf %>%
           filter(anio >1960) %>% 
  ggplot(aes(anio,valor , color = estimacion))+
  geom_line()+
  labs(y= "Millones de pesos de 2018", 
       title = "Estimacion de Activo usptream y PPyE total a partir de ampliación de pozos YPF")

Inversiones

Fuentes:

  1. construir serie de inversión para atras (buscar Stock de YPF pero solo para extracción). armar ejercicio de FD y ver si las proporciones se mantienen.
  • Reconstruccion de serie de inversion por empresa ver un flujo de pozos y un flujo de inversion y luego ver si lo que mueve la inversion son los pozos (que su evolucion sea similar).

  • inversion por empresa (balance: variacion del activo + consumo de K fijo)

  • inversion por empresa (secretaria de energia)

  • inversion agregada (tipo de inversion) (cuentas nacionales?)

  • pozos nuevos por empresa por año

  • pozos nuevos totales

  • aplicar MIP para YPF

Inversión a partir de Balances

Inversión a partir de Secretaria de Energía

Análisis de correlación entre Inversión y Pozos

  • buscar correlacion, para ver si la serie de inversión se mueve similar a los pozos
  • usar stock y ademas usar variacion de stock (bs de uso)

Con pozos de IAPG

Con pozos Cap IV

Regalías

  • Fuentes:
    • Secretaría de Energía (Base Regalías)

REVISAR EL CALCULO DE BETANIA cuanto ganarian las provincias si el precio del mercado interno se acomoda al internacional?

Subsidios

# CEFIP cont et al. Subsidios como % del PBI
subsidios_cefip <- read_excel("/Archivos/Datos/Hidrocarburos/subsidios/subsidios.xlsx") %>% 
  gather(key = anio,
         value = subsidios_porcentaje_pbi,
         2:ncol(.)) %>% 
  filter(sector %in% c("CAMMESA", "Plan Gas","ENARSA", "Subsidios FF GN y GLP")) %>% 
  mutate(anio = as.double(anio)) %>% 
  left_join(ganancia_y_pbi %>% 
              select(anio, pbi)) %>%
  mutate(subsidios_porcentaje_pbi=as.double(subsidios_porcentaje_pbi),
         subsidios_cefip = subsidios_porcentaje_pbi * pbi * 10^6) %>% 
  group_by(anio) %>% 
  summarise(unidad = "Pesos corrientes",
            subsidios_cefip=sum(subsidios_cefip, na.rm = T))
Joining, by = "anio"
NAs introducidos por coerci昼㸳n
#ejes 
subsidios_ejes <- read_excel("/Archivos/Datos/Hidrocarburos/Estimacion propia/subsidios.xlsx" ) %>% 
  rename(subsidios_usd = subsidios_hidrocarburos) %>% 
  right_join(tcp_anual_b %>% 
               select(anio, tcc), by = "anio") %>%
  group_by(anio) %>% 
  summarise(unidad = "Pesos corrientes",
         subsidios_ejes = subsidios_usd*tcc*10^6)

subsidios_hidrocarburos <- subsidios_ejes%>% 
  select(anio, unidad, subsidios_ejes) %>% 
  full_join(subsidios_cefip, by =c("anio", "unidad")) %>% 
  arrange(-anio) %>% 
  mutate(unidad = "Pesos corrientes")
         # x = subsidios_cefip/subsidios_ejes)
subsidios_hidrocarburos  

Valor total de la producción

Criterios metodológicos

Se presentan a continuación distintas estimaciones sobre la magnitud de riqueza presente en el sector hidrocarburífero: Valor Bruto y Agregado de Producción (VBP y VA), Consumo Interemedio (CI), Masa Salarial (MS) y Excedente Bruto de Explotación (EBE). El VBP surge de la valuación de la producción a sus precios correspondientes. El VA resulta de la diferencia entre el VBP y CI, el cual puede surgir originalmente de esta resta o a partir del coeficiente técnico de la Matriz Insumo Producto (MIP). El EBE constituye la plusvalía (PV) total de la rama, es decir, la suma de la renta de la tierra (RT) más la ganancia normal (Gnorm), y se obtiene luego de descontar la MS y los impuestos específicos (Imp) del VA. En todos los casos que se presentarán a continuación, los Imp se calcularon a partir de aplicar sobre el VBP un coeficiente resultante del peso de los impuestos promedio de la MIP de 1997. Lo mismo pasa con la estimación de la depreciación de capital o consumo de capital fijo (ConsKfijo), que se obtiene a partir de aplicar la tasa de depreciación promedio resultante de los balances de YPF (1998 - 2018) sobre el total de Propiedad, Planta y Equipo (PPyE) de la rama. Esta partida se aplica para obtener el Excedente Neto de Explotación. Se presentan distintas estimaciones para el VBP, CI y MS, que luego se observarán en la formulación matemática:

  • CCNN (ccnn_oficial)
    • Valores contables oficiales de las Cuentas Nacionales (sólo disponible para el período 2004-2012). Dado que se presentan series de VBP y VA, se pudo estimar el CI como la diferencia de dichas cuentas. Se procedió a separar el VBP a partir del peso del VBP de los servicios de apoyo a la extracción sobre el VBP de extracción de petróleo y gas, presente en el Cuadro de Utilización de Oferta (COU) de 2004 de INDEC. Se descontó esta proporción (resultante del 10,7%) del VBP total para obtener un VBP sólo de extracción. Dado que se posee información del salario promedio del sector y el empleo, se pudo obtener la MS resultante, tanto para el total del sector (extracción y servicios relacionados) como para sólo extracción. A partir de estos datos se elaboró un coeficiente que refleja el promedio de la proporción de la MS sobre el VBP que se utilizará en cálculos posteriores de MS total y MS de extracción.
  • Estimación propia con criterio CCNN (vbp_va_ci_propia)
    • Estimación propia de los valores contables a partir de las fuentes recopiladas, siguiendo los criterios de las Cuentas Nacionales. Es decir, para obtener el VBP se valua la producción destinada al mercado interno (resultante a partir de la diferencia entre producción y exportaciones) con los precios internos y las exportaciones con los precios de exportación, valuados tipo de cambio comercial (TCC). Se procedió también a separar el VBP de extracción neto de los servicios tal como se explicó anteriormente. El CI se estimó a partir de aplicar el coeficiente técnico (ratio CI/VBP) resultante de la MIP de 1997 (equivalente a 0.272). De igual manera, para calcular la masa salarial se aplicó el coeficiente de MS mencionado anteriormente. Finalmente, como se mencionó anteriormente, el VA el EBE se calcularon a partir de las diferencias mencionadas anteriormente.
  • Empalme CCNN (vbp_ccnn)
    • Estimación que toma los valores oficiales de las cuentas nacionales para el período donde se presentan datos (2004 -2012) y que imputa los valores faltantes por medio de la evolución del índice del VBP propio con criterio CCNN explicado anteriormente. Asimismo, se utilizaron los valores oficiales de la MS cuando se encontraba disponible el dato (1996-2018), mientras que se utilizó el valor propio estimado con criterio de las CCNN para los restantes años.
  • Criterio Propio (pv_hidrocarburos_propia)
    • Estimación propia que refleja con mayor precisión el valor de la riqueza total presente en el sector. El VBP se obtiene a paritr de valuar la totalidad de la producción a los precios externos o de referencia internacional y con el tipo de cambio de paridad (TCP), que mide la capacidad real de compra de la moneda nacional. Sin embargo, como el CI constituye intercambios de mercancías realizadas en el ámbito nacional, dicha partida se obtiene a partir de los valores obtenidos en la serie de empalme CCNN. De igual manera, se utilizó la MS resultante de esta última estimación.

Formulación matemática de estimaciones

Valor Bruto de Producción total, estimación con criterio propio \[VBP_{propia} = (Pext_{petróleo} * Q_{petróleo} + Pext_{gas} * Q_{gas}) * TCP\]

Donde:

  • \(VBP_{propia}\) = Valor Bruto de la Producción total, estimación propia
  • \(Pext_{petróleo}\) = Precio de exportación o referencia internacional del petróleo crudo (según corresponda)
  • \(Pext_{gas}\) = Precio de exportación o referencia internacional del gas natural (según corresponda)
  • \(Q_{petróleo}\) = Cantidades producidas totales de petróleo crudo
  • \(Q_{gas}\) = Cantidades producidas totales de gas natural
  • \(TCP\) = Tipo de Cambio de Paridad

Valor Bruto de Producción total, estimación con criterio CCNN \[VBP_{CCNN} = (Pint_{petróleo} * QMInt_{petróleo} + Pext_{petróleo} * Expo_{petróleo} + Pint_{gas} * QMInt_{gas} + Pext_{gas} * Expo_{gas})* TCC\]

Donde:

  • \(VBP_{CCNN}\) = Valor Bruto de la Producción total, estimación propia con criterio de las CCNN
  • \(Pint_{petróleo}\) = Precio mercado interno del petróleo crudo
  • \(Pint_{gas}\) = Precio mercado interno del gas natural
  • \(QMInt_{petróleo}\) = cantidades vendidas al mercado interno de petróleo crudo
  • \(QMInt_{gas}\) = cantidades vendidas al mercado interno del gas natural
  • \(Expo_{petróleo}\) = exportaciones de petróleo crudo
  • \(Expo_{gas}\) = exportaciones de gas natural
  • \(TCC\) = Tipo de Cambio Comercial


Valor Bruto de Producción extracción, estimación con criterio CCNN

\[VBP\_extr_{CCNN} = VBP_{CCNN} * (1-prop\_servicios)\]

Donde:

  • \(VBP\_extr_{CCNN}\) = Valor Bruto de la Producción extracción, estimación propia con criterio de las CCNN
  • \(prop\_extr\) = proporción del VBP de servicios de apoyo sobre VBP de extracción de petróleo y gas

Proporción de los servicios de apoyo sobre la extracción de petróleo y gas
\[prop\_servicios = \frac{VBP\_servicios_{COU}}{VBP\_extr_{COU}}\]

Donde:

  • \(VBP\_servicios_{COU}\) = VBP de servicios de apoyo del Cuadro de Utilización de Oferta
  • \(VBP\_extracción_{COU}\) = VBP de extracción de petróleo y gas del Cuadro de Utilización de Oferta


Consumo Intermedio, valores oficiales de las CCNN \[ CI_{CCNN} = VBP_{CCNN} - VA_{CCNN} \]

Donde:

  • \(CI_{CCNN}\) = Consumo Intermedio total, estimación propia
  • \(VA_{CCNN}\) = Valor Agregado, estimación de las CCNN


Consumo Intermedio, estimación con criterio CCNN \[ CI_{CCNN} = VBP_{CCNN} * Coef\_tec \] Donde:

  • \(Coef\_tec\) = Coeficiente técnico de Matriz Insumo Producto


Consumo Intermedio de extracción, estimación con criterio CCNN

\[ CI\_extr_{CCNN} = VBP\_extr_{CCNN} * Coef\_tec \]

Donde:

  • $ CI_extr_{CCNN}$ = Consumo Intermedio de extracción, estimación criterio CCNN


Masa Salarial, valores oficiales de las CCNN \[MS = W * Emp * 13\] Donde:

  • \(MS\) = Masa Salarial
  • \(W\) = Salario anual promedio
  • \(Emp\) = Empleo


Masa Salarial, estimación con criterio CCNN \[MS = VBP_{CCNN} * Coef\_MS\]

Donde:

  • \(Coef\_MS\) = Coeficiente de la proporción de MS sobre VBP


Masa Salarial de extracción, estimación con criterio CCNN \[MS\_extr = VBP\_extr_{CCNN} * Coef\_MS\]

Donde:

  • \(MS\_extr\) = Masa salarial del sector extracción


Valor agregado, estimación criterio CCNN \[VA_{CCNN} = VBP_{CCNN} – CI_{CCNN} \] Donde:

  • \(VA_{CCNN}\) = Valor Agregado, estimación propia con criterio CCNN


Valor agregado de extracción, estimación con criterio CCNN \[VA\_extr_{CCNN} = VBP\_extr_{CCNN} – CI\_extr_{CCNN} \]

Donde:

  • \(VA\_extr_{CCNN}\) = Valor Agregado de extracción, estimación propia con criterio CCNN


Valor agregado, estimación con criterio propio \[VA_{propia} = VBP_{propia} – CI\_extr_{CCNN} \]

Donde:

  • \(VA_{propia}\) = Valor Agregado, estimación con criterio propio


Excedente Bruto de Explotación, estimación con criterio CCNN \[EBE_{CCNN} = VA_{CCNN} – MS \]

Excedente Bruto de Explotación de extracción, estimación con criterio CCNN \[EBE\_extr_{CCNN} = VA\_extr_{CCNN} – MS\_extr \]


Excedente Bruto de Explotación, estimación con criterio propio \[EBE_{propia} = VA_{propia} – MS\_extr \]

Donde:

  • \(EBE\) = Excedente Bruto de Explotación
  • \(CI\_extr_{CCNN}\) = Consumo intermedio del sector extracción, estimación con criterio CCNN


Consumo de Capital Fijo, estimación con criterio propio \[ConKfijo = PPyE * prom(\frac{Dep}{PPyE}) \]

Donde:

  • \(ConKfijo\) = Consumo de Capital Fijo
  • \(PPyE\)= Propiedad, Planta y Equipo neta
  • $prom() $ = tasa de depreciación promedio
  • \(Dep\) = Depreciaciones (cuenta gastos por naturaleza)


Plusvalía (Excedente Neto de Explotación), estimación con criterio propio \[PV_{propia} = VA_{propia} - ConKfijo - Imp \]

Donde:

  • \(PV_{propia}\) = Plusvalía (Excedente Neto de Explotación)
  • \(Imp\) = Impuestos normales

Fuentes para la construcción de series

  • Producción de Crudo:
    • 1911 a 1992: Anuario de combustibles
    • 1993 - actualidad: SESCO Downstream
  • Exportaciones de Crudo:
    • 1962 a 1993: UN Comtrade (clasificación SITC as reported)
    • 1994 en adelante: SESCO Downstream
    • Los datos faltantes de SESCO se completaron con MECON
    • Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84
  • Precio Mercado Interno de Crudo:
    • 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
    • 1989 a 1991: Anuario de YPF
    • 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
    • 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
    • 1993 en adelante: MECON
  • Precio Mercado Externo Crudo:
    • entre 1962 y 1992: precio de exportación argentina de UN Comtrade
    • entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
    • entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
    • 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
    • Valores faltantes previos a 1992: Brent (Fuente: Inflation Data)
  • Producción de Gas:
    • 1911 a 1992: Anuario de combustibles
    • 1993 en adelante: SESCO Downstream
  • Exportaciones de gas:
    • 1962 a 1996: UN Comtrade,
    • 1997 en adelante: SESCO Downstream
    • Datos faltantes para los años 1999 y 2000
  • Precio Mercado Interno de gas:
    • 1963 - 1969 & 1989 - 1992: Anuario de YPF
    • 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
    • 1993 en adelante: Secretaría de Energía - Base Regalías
    • El dato del año 1992 se dividió por 10, dado que resultaba excesivamente alto, lo cual es metodológicamente inaceptable pero sirve de ejercicio.
  • Precio Mercado Externo:
    • Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
    • 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
    • Datos faltantes para los años previos a 1963 y período 1968-1971
  • Valor Bruto de la Producción, Valor Agregado y Consumo Intermedio:
    • INDEC - Dirección Nacional de Cuentas Nacionales (Base Minería e Hidrocarburos de las Cuentas Nacionales). Las variables “extraccion_y_servicios_hidrocarburos” refieren a “Extracción de petróleo crudo y gas natural. Actividades de servicios relacionadas con la extracción de petróleo y gas, excepto las actividades de prospección”
    • Cálculo propio del VBP con datos datos de producción y precio internacional recopilados. Las fuentes son las siguientes (los criterios son los mismos para la utilización posterior en el cálculo de renta de la tierra hidrocarburífera por diferencial de precios, sobrevaluación cambiaria y otros mecanismos)
  • Salario y empleo
    • 1960-1996: estimación a partir de aplicación del coeficiente de proporción de la masa salarial sobre el VBP
    • 1996 en adelante: Ministerio de Trabajo, Empleo y Seguridad Social - Observatorio de Empleo y Dinámica Empresarial (OEDE)
  • Consumo de capital fijo
    • Coeficiente de depreciación estimado a partir de Estados Contables de YPF (1998-2018)

Cuentas Nacionales

Producto Interno Bruto Explotación Minas y Canteras Millones de pesos constantes. Base 1960. Valores trimestrales PIB Explotación Minas y Canteras en millones de pesos de 1960. 1970-1980

Producto Interno Bruto Explotación Minas y Canteras, Australes constantes. Base 1970.Valores trimestrales PIB Explotación Minas y Canteras en australes a precios de 1970. 1980-1990

Estimaciones propias

Tasa de Ganancia

\[TG_{hidrocarburos} = \frac{PV_{hidrocarburífera}}{KTA_{hidrocarburífero}}\]

Renta apropiada por las empresas de la rama

La renta apropiada por las empresas de la rama se calcula por medio del diferencial de tasas de ganancia entre el sector hidrocarburífero que surge a partir de los balances y la rentabilidad normal de la economía.

\[Renta\_empresas = KTA_{hidrocarburífero} * (TG_{hidrocarburífera} - TG_{referencia})\] \[TG_{hidrocarburífera} = \frac{Gcia_{hidrocarburos}}{KTA_{hidrocarburífero}}\] Por lo cual, la renta apropiada por las empresas de la rama sería equivalente a:

\[Renta\_empresas = Gcia_{hidrocarburos} - KTA_{hidrocarburífero} * TG_{referencia}\]

Donde:

  • \(KTA_{hidrocarburífero}\) = Stock de capital adelantado de empresas hidrocarburíferas
  • \(TG_{hidrocarburífera}\) = Tasa de ganancia de empresas hidrocarburíferas
  • \(TG_{referencia}\) = Tasa de ganancia de referencia
  • \(Gcia_{hidrocarburos}\) = Ganancia de empresas hidrocarburíferas
Joining, by = "anio"

Renta por el diferencial de precios entre el mercado interno y las referencias internacionales

Renta apropiada mediante el abaratamiento en el consumo interno por efecto del diferencial de precios interno/externo, sobrevaluación de la moneda y retenciones a la exportación

Criterio de cómputo de JK (variable ‘renta_dif_precios’)

\[RDP= ProdInt * Pext * TCP - ProdInt * PMI * TCC\]

Donde:

  • \(RDP\) = Renta apropiada por efecto diferencial de precios interno/externo y sobrevaluación
  • \(MdoInt\) = Producción destinada al Mercado Interno: Producción - Exportaciones - Existencias (barriles de petróleo ó MMBTU)
  • \(Pext\) = Precio de referencia del mercado externo (USD)
  • \(PMI\) = Precio de venta del mercado interno (USD)
  • \(TCP\) = Tipo de Cambio de Paridad
  • \(TCC\) = Tipo de Cambio Comercial

Criterio de cómputo de JIC y cia (variable ‘renta_abaratamiento_sobrevaluacion’)

\[RDP = MdoInt * PMI * (\frac{TCP}{TCC} - 1)\]

Renta apropiada por sobrevaluación cambiaria

\[Rsobrevaluacion = Expo * Pext * (TCP - TCC)\]

Donde: * \(Rsobrevaluacion\) = Renta apropiada por exportaciones con tipo de cambio sobrevaluado * \(Expo\) = Exportaciones (barriles de petróleo ó MMBTU) * \(Pext\) = Precio de referencia del mercado externo (USD) * \(TCP\) = Tipo de Cambio de Paridad * \(TCC\) = Tipo de Cambio Comercial

Joining, by = "anio"

Renta apropiada por el Estado mediante impuestos específicos

Joining, by = "anio"
Joining, by = c("anio", "unidad")
`summarise()` has grouped output by 'anio'. You can override using the `.groups` argument.
Joining, by = c("anio", "unidad")

\[Rimp = RE + Reg\]

Donde:

  • \(Rimp\) = Renta apropiada por el Estado mediante impuestos específicos
  • \(RE\) = Retenciones
  • \(Reg\) = Regalias

Renta apropiada por consumidores y refinerías y procesadoras

Criterio de cómputo de Ramón (2019)

Refinerías y procesadoras

\[RR = (PI - PRMi) * CrudoP\]

  • \(RR\) = Renta apropiada por las Refinadoras
  • \(PI\) = promedio ponderado de Precios Internacionales
  • \(PRMi\) = Precio ponderado a Refinerías del Mercado Interno
  • \(CrudoP\) = barriles de Crudo Procesado por las refinadoras

Consumidores

\[RC = (PI - PRMi - MR) * CrudoP \]

  • \(RC\) = Renta apropiada por los Consumidores
  • \(MR\) = Margen de Refinerías

Esto resulta equivalente a plantear:

\[RC = PCMi * CrudoP\]

  • \(PCMi\) = Precio ponderado a Consumidores del Mercado Interno.

Renta Hidrocarburífera Total. En precios constantes, sobre Plusvalía Total y PBI

Existen dos caminos para llegar al monto total de renta de la tierra hidrocarburífera: uno es descontando la ganancia normal de las empresas a la plusvalía total del sector y el otro es por medio de la suma de mecanismos de apropiación.

\[Renta\_hidrocarburífera = PV_{hidrocarburífera} - Gcia\_Normal_{hidrocarburífera}\] Donde:

  • \(Gcia\_Normal_{hidrocarburífera}\) = Ganancia Normal del sector hidrocarburífero
  • \(PV_{hidrocarburífera}\) = Plusvalía del sector hidrocarburífero

\[Gcia\_Normal_{hidrocarburífera} = KTA_{hidrocarburífero} * TG_{referencia}\]

Donde:

  • \(KTA_{hidrocarburos}\) = Stock de capital adelantado del sector hidrocarburífero
  • \(TG_{referencia}\) = Tasa de ganancia normal de referencia.

En este caso, seleccionamos la tasa de ganancia del sector industrial como parámetro para diferenciar la renta de la ganancia. A su vez, para el capital total adelantado de las empresas hidrocarburíferas, seleccionamos unicamente el valor resultante de la estimación de la PPyE de Bolsar a partir del indice de flujo de pozos (variable “ppye_bolsar_flujo”), por lo que le faltan los inventarios y salarios adelantados.

El cálculo de renta total hidrocarburífera que se obtiene por medio de descontar la ganancia normal a la plusvalía total del sector, debe ser igual a la renta obtenida por medio de la agregación de los distintos mecanismos de apropiación. Es decir:

\[Renta\_hidrocarburífera = Renta\_diferencial\_precios + Renta\_sobrevaluación + Renta\_empresas + Impuestos\_netos\_específicos \] \[Impuestos\_netos\_específicos = Retenciones + Regalías - Subsidios\]

Método directo (a partir de descuentos sobre el VBP)

Joining, by = "anio"
Joining, by = "anio"

Método indirecto (suma de mecanismos)

Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
`mutate_all()` ignored the following grouping variables:
Column `anio`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
`mutate_all()` ignored the following grouping variables:
Column `anio`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Removed 21 rows containing missing values (position_stack).'big.mark' and 'decimal.mark' are both '.', which could be confusing
'big.mark' and 'decimal.mark' are both '.', which could be confusing

#################### solo gas
# Gas
# renta_gas_pbi_pv <- renta_diferencial_precios_gas %>% 
#   select(anio,renta_diferencial_precios_gas, renta_abaratamiento_sobrevaluacion_gas ) %>% 
#   group_by(anio ) %>% 
#   mutate_all(function(x) {x / 10^6}) %>% 
#   left_join(ganancia_y_pbi) %>% 
#   mutate(renta_dif_precios_gas_pv = renta_dif_precios_gas/ganancia,
#          renta_dif_precios_gas_pbi = renta_dif_precios_gas/pbi,
#          renta_abaratamiento_sobrevaluacion_gas_pv = renta_abaratamiento_sobrevaluacion_gas/ganancia,
#          renta_abaratamiento_sobrevaluacion_gas_pbi = renta_abaratamiento_sobrevaluacion_gas/pbi,
#          unidad = "Millones de Pesos corrientes")
# 
# graf_renta_gas_pv <- renta_gas_pbi_pv %>% 
#   select(anio, 7:ncol(.) ) %>% 
#   gather(key = tipo_renta,
#          value = valor,
#          2:ncol(.)) %>% 
#   ggplot(aes(anio, valor, color = tipo_renta, fill = tipo_renta))+
#   geom_col(position = "dodge")+
#   theme(legend.position = "bottom")+
#   labs(title = "Renta petrolera por diferencial de precios interno y externo sobre PBI y Ganancias Totales",
#        y = "%")
# plotly::ggplotly(graf_renta_gas_pv)

Costos

\[Q\_total = Q_{petróleo} + Q_{gas} \] Donde:

  • \(Q\_total\) = Cantidades producidas de petróleo y gas en Barriles Equivalentes de Petróleo
  • \(Q_{petróleo}\) = Cantidades producidas de petróleo crudo en barriles equivalentes de petróleo (BOE)
  • \(Q_{gas}\) = Cantidades producidas de gas natural en barriles equivalentes de petróleo (BOE)

\[ Costos\_totales = CI + MS + ConKfijo\]

Donde:

  • \(Costos\_totales\) = Costos totales hidrocarburíferos
  • \(CI\) = Consumo Intermedio, distintas estimaciones
  • \(MS\) = Masa Salarial, distintas estimaciones
  • \(ConKfijo\) = Consumo de Capital Fijo

\[Costos\_totales\_con\_Gcia = Costos\_totales + Gcia\_Normal_{hidrocarburífera} \] Donde:

  • \(Costos\_totales\_con\_Gcia\) = Costos totales hidrocarburíferos con ganancia normal
  • \(Gcia\_Normal_{hidrocarburífera}\) = Ganancia normal del sector hidrocarburífero

\[ Precio\_costo = \frac{Costos\_totales}{Q\_total} \] Donde: * \(Precio\_costo\) = Precio de costo en BOE

A partir de esto se puede calcular un costo recuperable del petróleo y del gas

\[Costo\_crudo = Q_{petróleo} * Precio\_costo\] \[Costo\_gas = Q_{gas} * Precio\_costo\]

\[Precio\_produccion = \frac{Costos\_totales\_con\_Gcia}{Q\_total}\]

\[Precio\_vta\_potencial = \frac{Q\_total*Pext_{petróleo} - Costos\_totales}{Q\_total} \]

Donde: * \(Precio\_produccion\)= Precio de produccion * \(Precio_vta_potencial\) = Precio de venta potencial * \(Pext_{petróleo}\) = Precio de exportación/referencia internacional del petróleo crudo

Comparación con estimación de otros autores


#renta usd vs autores
#falta agregar renta_hidrocarburos_jk
renta_autores <- renta_indirecto %>% 
  select(anio,tcc, tcp, ipc_18, retenciones, regalias_total, contains("renta")) %>% 
  select( -(13:ncol(.))) %>% 
  filter(anio > 1962) %>%
  mutate( retenciones= retenciones*ipc_18/tcc,       
          regalias_total = regalias_total*ipc_18/tcc, 
          renta_diferencial_precios_crudo = renta_diferencial_precios_crudo*ipc_18/tcp,
          renta_diferencial_precios_gas = renta_diferencial_precios_gas*ipc_18/tcp,
          renta_expo_sobrevaluada_crudo = renta_expo_sobrevaluada_crudo*ipc_18/tcp,  
          renta_expo_sobrevaluada_gas = renta_expo_sobrevaluada_gas*ipc_18/tcp  ,
          renta_sobrevaluacion = renta_expo_sobrevaluada_crudo+ renta_expo_sobrevaluada_gas,
          renta_diferencial_precios = 
            renta_diferencial_precios_gas+ renta_diferencial_precios_crudo,
          # renta_empresas = renta_empresas*ipc_18/tcc,
          # renta_empresas_desp_impuestos = renta_empresas_desp_impuestos*ipc_18/tcc,
          renta_total = (renta_total*ipc_18) / tcp,
          unidad = "Millones de USD",
         autor = "Propia") %>% 
  rename(retenciones = retenciones,
         regalias = regalias_total
          # renta_empresas = renta_empresas_desp_impuestos,
         # renta_total_gas = renta_diferencial_precios_gas,
         # renta_total_crudo = renta_diferencial_precios_crudo,
         ) %>% 
  select(anio, unidad, autor, everything(.), 
         -c(ipc_18, tcc, tcp, renta_expo_sobrevaluada_crudo, renta_expo_sobrevaluada_gas,
            renta_diferencial_precios_gas, renta_diferencial_precios_crudo)) %>% 
  gather(key = tipo_de_renta,
         value = valor,
         4:ncol(.)) %>% 
    bind_rows(renta_autores)
#####


#grafico comparacion con otros autores
graf_tipos_renta <- renta_autores %>% 
  filter(!(tipo_de_renta%in% c("renta_total", 
                               "renta_diferencial_precios",
                               "renta_estado_total"))) %>% 
  ggplot(aes(anio, valor, color = autor))+
  geom_line()+
  geom_point(size = 0.5)+
  facet_wrap(~tipo_de_renta, scales = "free_y")+
  labs(title = "Renta hidrocarburífera", 
       subtitle = "Comparación de estimaciones. Millones USD", 
       y = "Millones de USD")+
  theme_classic()+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplotly(graf_tipos_renta, width = 800, height = 600)  



graf_renta_total_comparacion <- renta_autores %>% 
  # filter(!(autor == "Propia" & tipo_de_renta == "renta_total")) %>%
  # mutate(tipo_de_renta= case_when(tipo_de_renta =="renta_diferencial_precios" &
  #                                   autor == "Propia" ~ "renta_total",
  #                                 T ~ tipo_de_renta)) %>%
  filter(tipo_de_renta == "renta_total") %>% 
  ggplot(aes(anio, valor, color = autor))+
  geom_line()+
  geom_point()+
  theme(legend.position = "bottom")+
  labs(title = "Renta hidrocarburífera total (petróleo y gas)", 
       subtitle = "Con renta total propia metodología autores", 
       y = "Millones de USD")+
  theme_classic()+
  scale_y_continuous(labels=function(x) format(x, big.mark = ".", scientific = FALSE))
graf_renta_total_comparacion


ggplotly(graf_renta_total_comparacion, width = 600, height = 400)
'big.mark' and 'decimal.mark' are both '.', which could be confusing
# ggplotly(graf_renta_total_comparacion_b)

Exportacion de resultados

LS0tDQp0aXRsZTogIlJlbnRhIGRlIGxhIHRpZXJyYSBoaWRyb2NhcmJ1csOtZmVyYSBlbiBBcmdlbnRpbmEgKDE5NjAgLSAyMDE4KSINCmF1dGhvcjoNCi0gYWZmaWxpYXRpb246IFVOR1MvQ09OSUNFVA0KICBuYW1lOiBNYXRlbyBTdXN0ZXIgeSBKdWFuIEtvcm5ibGlodHQNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHllcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAga2VlcF90ZXg6IHllcw0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCi0tLQ0KDQo8YnI+DQo8YnI+DQoNCjxjZW50ZXI+IDxoMT48L2gxPiA8L2NlbnRlcj4gDQoNCg0KDQpgYGB7cn0NCiMgcGFyYSBndWFyZGFyIGdncGxvdCBjb24gdGFtYcOxbw0KIyBnZ3NhdmUoImZhY2V0X3dyYXBfY2hhcnQucG5nIiwgZmFjZXRfd3JhcF9jaGFydCwgd2lkdGggPSAxNjgwLzcyLCBoZWlnaHQgPSAxMDUwLzcyLCBkcGkgPSA3MikNCg0KYGBgDQoNCiAgDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBsaWJyYXJ5KHh0YWJsZSkgIyBlaiB4dGFibGUodGFibGEpIHBhcmEgcGFzYXIgYSBsYXRleA0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSkNCg0KbGlicmFyeShyZWFkeGwpIA0KIyBsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoZnMpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoaHV4dGFibGUpICNyZXZpc2FyIGVzdG8gcGFyYSBkYXIgZm9ybWF0byBhbCBlamUgWQ0KIyBsaWJyYXJ5KFBlcmZvcm1hbmNlQW5hbHl0aWNzKQ0KbGlicmFyeShIbWlzYykNCmxpYnJhcnkoem9vKQ0KDQoNCg0Kb3B0aW9ucyhzY2lwZW4gPSA5OTk5OTk5KQ0KDQojIGFncmVnYXIgbGFiZWwgcGFyYSB2YXJpYWJsZXMgZGUgZ3JhZmljb3MgDQojZmFjZXR3cmFwKH4gZXhwZXJpbWVudG94LCBsYWJlbGxlciA9IGFzX2xhYmVsbGVyKGV4cF9uYW1lcykpKyAgDQoNCmBgYA0KDQojIEZ1bmNpb25lcyBkZSBjb252ZXJzacOzbiANCg0KKiBbQ2FuYWRhIOKAkyBOYXRpb25hbCBFbmVyZ3kgQm9hcmQuIEVuZXJneSBDb252ZXJzaW9uIFRhYmxlc10oaHR0cHM6Ly9hcHBzLmNlci1yZWMuZ2MuY2EvQ29udmVyc2lvbi9jb252ZXJzaW9uLXRhYmxlcy5hc3B4P0dvQ1RlbXBsYXRlQ3VsdHVyZT1lbi1DQSMyLTMpDQoqIFtCUF0oaHR0cHM6Ly93d3cuYnAuY29tL2NvbnRlbnQvZGFtL2JwL2J1c2luZXNzLXNpdGVzL2VuL2dsb2JhbC9jb3Jwb3JhdGUvcGRmcy9lbmVyZ3ktZWNvbm9taWNzL3N0YXRpc3RpY2FsLXJldmlldy9icC1zdGF0cy1yZXZpZXctMjAxOS1hcHByb3hpbWF0ZS1jb252ZXJzaW9uLWZhY3RvcnMucGRmKQ0KKiBbRUlBXShodHRwczovL3d3dy5laWEuZ292L2tpZHMvd2hhdC1pcy1lbmVyZ3kvZW5lcmd5LWNhbGN1bGF0b3JzLnBocCNuYXRnYXNjYWxjKQ0KDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgRnVuY2lvbmVzIGRlIGNvbnZlcnNpw7NuIHBhcmEgY3J1ZG8NCiMjIE1ldHJvIGN1YmljbyBhIGJhcnJpbCAoX3AgPSBwcmVjaW8sIF9xID0gY2FudGlkYWQpDQpjb252ZXJzb3JfbTNiYmxfcCA8LSBmdW5jdGlvbih4KSB7eCAvIDYuMjg5OH0NCmNvbnZlcnNvcl9tM2JibF9xIDwtIGZ1bmN0aW9uKHgpIHt4ICogNi4yODk4fQ0KDQojIEZ1bmNpb25lcyBkZSBjb252ZXJzacOzbiBwYXJhIGdhcw0KIyMgUGllcyBjw7piaWNvIGEgbWV0cm8gY8O6Ymljbw0KIyMgMWZ0wrM9IDAuMDI4MzE2ODVtwrMNCmNvbnZlcnNvcl9mdDNtM19wIDwtIGZ1bmN0aW9uKHgpIHt4IC8gMC4wMjgzMTY4NX0NCmNvbnZlcnNvcl9mdDNtM19xIDwtIGZ1bmN0aW9uKHgpIHt4ICogMC4wMjgzMTY4NX0NCg0KIyMgUGllIGPDumJpY28gYSBNaWxsw7NuIGRlIEJUVQ0KIyAxIGZ0MyA9ICAwLjAwMTAyOCBNTSBCVFUNCmNvbnZlcnNvcl9mdDNNTUJUVV9xIDwtIGZ1bmN0aW9uKHgpIHt4ICogMC4wMDEwMjh9DQpjb252ZXJzb3JfZnQzTU1CVFVfcCA8LSBmdW5jdGlvbih4KSB7eCAvIDAuMDAxMDI4fQ0KDQojIyBNaWxsw7NuIGRlIEJUVSBhIG1ldHJvIGPDumJpY28NCiMjIDEgTU0gQnR1ID0gIDI3LDggbTMgZGUgZ2FzIChJQVBHKSDDsyAyOC4zMjg2MSBtMyAoQ2FuYWRhIEVuZXJneSBSZWd1bGF0b3IpICANCmNvbnZlcnNvcl9NTUJUVW0zZ2FzX3AgPC0gZnVuY3Rpb24oeCkge3ggLyAyOC4zMjg2MX0NCiAgDQojIyBtMyBhICBNTUJUVSBkZSBnYXMNCiMgMSBtMyA9IDAuMDM1MyBNTSBCVFUgIChDYW5hZGEgRW5lcmd5IFJlZ3VsYXRvcikNCiMgb3RyYSBvcGNpw7NuIDEgbTMgPSAzNC4xMjEgTU0gQlRVICAoQlApDQpjb252ZXJzb3JfbTNNTUJUVV9xIDwtIGZ1bmN0aW9uKHgpe3ggKiAwLjAzNTN9DQpjb252ZXJzb3JfbTNNTUJUVV9wIDwtIGZ1bmN0aW9uKHgpe3ggLyAwLjAzNTN9DQoNCiMjIG0zIGEgIE1NQlRVIChBbHRlcm5hdGl2YSwgcmV2aXNhcikNCiMgY29udmVyc29yX20zTU1CVFVfcSA8LSBmdW5jdGlvbih4KXt4ICogMS8yNy44fQ0KIyBjb252ZXJzb3JfbTNNTUJUVV9wIDwtIGZ1bmN0aW9uKHgpe3ggLyAxLzI3Ljh9DQoNCiMjIENvbnZlcnNpw7NuIGEgQkVQIGRlc2RlIGRpc3RpbnRhcyBtZWRpZGFzDQpjb252ZXJzb3JfbTNiZXBfcSA8LSBmdW5jdGlvbih4KSB7eCAqIDU4ODN9DQpjb252ZXJzb3JfTU1CVFViZXBfcSA8LSBmdW5jdGlvbih4KSB7eCAqIDAuMTcyNDU0OTZ9ICMgQlANCmNvbnZlcnNvcl9NTUJUVWJlcF9wIDwtIGZ1bmN0aW9uKHgpIHt4IC8gMC4xNzI0NTQ5Nn0NCmNvbnZlcnNvcl9iZXBNTUJUVV9wIDwtIGZ1bmN0aW9uKHgpIHt4IC8gNS43OTg2MTV9DQpgYGANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBPdHJhcyBmdW5jaW9uZXMNCmNhbWJpb19wb3JjZW50dWFsIDwtIGZ1bmN0aW9uKHgpIHt4L2xhZyh4KSAtIDF9DQoNCmdlbmVyYXJfaW5kaWNlIDwtICBmdW5jdGlvbihzZXJpZSxmZWNoYSwgZmVjaGFfYmFzZSl7DQogIHZhbG9yX2Jhc2UgPC0gc2VyaWVbd2hpY2goZmVjaGE9PWZlY2hhX2Jhc2UpXQ0KICBpZl9lbHNlKHNlcmllID09IDAsIDAsIHNlcmllL3ZhbG9yX2Jhc2UpDQp9DQoNCg0KDQp2YXJpYWNpb25faW50ZXJhbnVhbCA8LSBmdW5jdGlvbih4KSB7eCAgLSBsYWcoeCl9DQoNCnRhc2FfY3JlY2ltaWVudG8gPC0gZnVuY3Rpb24oeCkgeyh4ICAtIGxhZyh4KSkvbGFnKHgpfQ0KDQoNCmdlbmVyYXJfaW5kaWNlIDwtICBmdW5jdGlvbihzZXJpZSxmZWNoYSwgZmVjaGFfYmFzZSl7DQogIHZhbG9yX2Jhc2UgPC0gc2VyaWVbd2hpY2goZmVjaGE9PWZlY2hhX2Jhc2UpXQ0KICAoc2VyaWUvdmFsb3JfYmFzZSkNCn0NCg0KDQoNCiMgVGFibGEgcGFyYSBjb252ZXJ0aXIgbG9zIGNhbWJpb3MgZGUgbW9uZWRhDQpjb252ZXJzb3JfcGVzb3MgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9wYXNlIGRlIG1vbmVkYS54bHN4IikgJT4lIA0KICAjIG11dGF0ZSgibSRuIiA9IGFzLmRvdWJsZShjb252ZXJzb3JfcGVzb3MkYG0kbmApKSAlPiUgDQogIG11dGF0ZV9hbGwoLiwgYXMuZG91YmxlKSAlPiUgDQogIG11dGF0ZShtb25lZGEgPSBjKCJtb25lZGEgbmFjaW9uYWwiLCAicGVzb3MgbGV5IiwgInBlc28gYXJnZW50aW5vIiwgImF1c3RyYWwiLCAicGVzb3MiKSkgJT4lIA0KICBmaWx0ZXIobW9uZWRhID09ICJwZXNvcyIpDQoNCmBgYA0KDQoNCg0KDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCg0KIyBEYXRvcyBhdXhpbGlhcmVzDQojI1JldmlzdGEgZGUgUG9sw610aWNhIGRlIFByZWNpb3MgZGUgbGEgRW5lcmfDrWENCiMjIEdBUw0KI3ByZWNpbyB0cmFuc2ZlcmVuY2lhLCByZWdhbGlhcywgY29tcGVuc2FjaW9uZXMsIGV0YyBhIG5vdmllbWJyZSBkZSBjYWRhIGHDsW8NCmN1YWRyb180LjEgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIGdhcyBuYXR1cmFsIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg4Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSAxKQ0KDQojcHJlY2lvIGJvbGl2aWEgdnMgcHJlY2lvcyBpbnRlcm5vcw0KY3VhZHJvXzQuMyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgZ2FzIG5hdHVyYWwgeSBkZXJpdmFkb3MgMTk3MCAtIDE5ODgueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDMpICU+JQ0KICByZW5hbWUodW5pZGFkX2dhcyA9ICJ1bmlkYWQgZ2FzIikgJT4lIA0KICBtdXRhdGUodW5pZGFkX2dhcyA9ICJwZXNvcyBkZSAxOTcwLzEwMDAgbTMiICkNCg0KI3ByZWNpbyBhZHF1aXNpY2nDs24gZGVsIEVzdGFkbyB5IHRhcmlmYSBtZWRpYSBkZSBnYXMgZGlzdHJpYnVpZG8NCmN1YWRyb180LjQgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIGdhcyBuYXR1cmFsIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg4Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSA0KQ0KYGBgDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMjIENSVURPDQoNCiMgUHJlY2lvcyBwb3IgY3VlbmNhDQpjdWFkcm9fMi4yIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDAsIHNoZWV0ID0gMikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gInBlc29zIGRlIDE5NzAiKQ0KDQojZXZvbHVjacOzbiBkZSBwcmVjaW9zIHBvciBjdWVuY2lhIChpbmRpY2VzIDE5NzAgPSAxMDApDQpjdWFkcm9fMi4zIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDAsIHNoZWV0ID0gMykgJT4lIA0KICByZW5hbWUoYW5pbyA9ICIuLi4xIikNCg0KDQojIHByZWNpbyBwcm9tZWRpbyBwYWdhZG8gYSBjb250cmF0aXN0YXMgZW4gcGVzb3MgeSBkb2xhcmVzDQpjdWFkcm9fMi41IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gNSkNCg0KIyBwcmVjaW9zIHBhZ2Fkb3MgYSBjb250cmF0aXN0YXMgdnMgY29icmFkb3MgcG9yIHJlZmluYWRvcmFzIHByaXZhZGFzIChwcmVjaW8gY3J1ZG8gbmV1cXVpbmEpDQpjdWFkcm9fMi42IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gNikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gInBlc29zX2RlXzE5NzBfbTMiKQ0KDQojIHZhbG9yZXMgdW5pdGFyaW9zIGRlbCBwcm9kdWN0byBjb21wdWVzdG8gYSBuaXZlbCBwcm9kdWN0b3JlcyB5IGNvbnN1bWlkb3Jlcw0KY3VhZHJvXzIuNyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgcGV0cm9sZW8gY3J1ZG8geSBkZXJpdmFkb3MgMTk3MCAtIDE5ODkueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDcpDQoNCmBgYA0KIA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIyMgVENQIA0KdGNwX2FudWFsIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL1RDUC90Y3BfYW51YWwueGxzeCIsIA0KICAgIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIikpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBmZWNoYSkNCg0KdGNwX2FudWFsX2IgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvVENQL3RjY190Y3BfaGlzdG9yaWNvLnhsc3giKSAlPiUgDQogIHJlbmFtZSh0Y2MgPSAgYFRDQyBleHBvcnRhY2lvbmVzYCwgc29icmV2YWx1YWNpb24gPSBgU29icmV2YWx1YWNpw7NuIChUQ1AvIFRDQykgMTk1Mi0xOTcyPTFgLA0KICAgICAgICAgdGNwID0gIlRDUCIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSBjYXNlX3doZW4oYW5pbyA9PSA0MzMxMyB+IDIwMTgsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBhbmlvKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdGNjLCB0Y3AsIHNvYnJldmFsdWFjaW9uKQ0KDQojIHRjXzM1MDAgPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL1RDUC9jb20zNTAwLnhscyIsIHNraXAgPSAzLCBzaGVldCA9IDEpICU+JSANCiMgICBzZWxlY3QoLSIuLi4zIikgJT4lIA0KIyAgIG11dGF0ZShhbmlvID0geWVhcihGZWNoYSkpICU+JSANCiMgICBncm91cF9ieShhbmlvKSAlPiUgDQojICAgc3VtbWFyaXNlKHRjY19hdmcgPSBtZWFuKGBUaXBvIGRlIENhbWJpbyBkZSBSZWZlcmVuY2lhIC0gZW4gUGVzb3MgLSBwb3IgRMOzbGFyYCkpDQojIHdyaXRlLmNzdih0Y18zNTAwLCAicmVzdWx0YWRvcy9hdXhpbGlhcmVzL3RjXzM1MDAuY3N2IikNCg0KdGNjX2RpY182MyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9UQ1AvdGNjX2RpY182My54bHN4IikNCg0KdGNjX21vbmVkYV9vcmlnaW5hbCA8LSAgdGNjX2RpY182MyAlPiUgDQogIHNlbGVjdCgtdXNkX2RpYykgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdChhbmlvLCB0Y2MgKSkgJT4lIA0KICBtdXRhdGUobW9uZWRhID0gY2FzZV93aGVuKGFuaW8gPT0gMTk4NCB+ICIkYXJnIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gbW9uZWRhKSwNCiAgICAgICAgICB0Y2NfbW9uZWRhID0gY2FzZV93aGVuKCAjaG9tb2dlbml6YW1vcyBsb3MgY2FtYmlvcyBkZSBtb25lZGENCiAgICAgICAgICAgICAgICAgbW9uZWRhID09ICJtJG4iIH4gdGNjKmNvbnZlcnNvcl9wZXNvcyRgbSRuYCAsDQogICAgICAgICAgICAgICAgIG1vbmVkYSA9PSAiJGxleSIgfiB0Y2MqY29udmVyc29yX3Blc29zJGAkTGV5YCwgDQogICAgICAgICAgICAgICAgIG1vbmVkYSA9PSAiJGFyZyIgfiB0Y2MqY29udmVyc29yX3Blc29zJGAkYWAsIA0KICAgICAgICAgICAgICAgICBtb25lZGEgPT0gIkEiIH4gdGNjKmNvbnZlcnNvcl9wZXNvcyRBLA0KICAgICAgICAgICAgICAgICBUIH4gdGNjKSApDQp0Y2NfbW9uZWRhX29yaWdpbmFsICANCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIyBJUEMNCmlwYyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9pbmRpY2VzL2lwY19tZW5zdWFsXzE5NjNfMjAxOC54bHN4IikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IHpvbzo6bmEubG9jZihhbmlvKSkgJT4lIA0KICByZW5hbWUoaXBjXzA3MDMgPSBgQmFzZSA3LzIwMDMgPSAxYCkgJT4lIA0KICBtdXRhdGUoZmVjaGEgPSBhcy5EYXRlKHBhcnNlX2RhdGVfdGltZShwYXN0ZShhbmlvLCBtZXMsIHNlcCA9ICItIiksIG9yZGVycyA9ICJ5bSIpKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGFuaW8sIG1lcyAsIGV2ZXJ5dGhpbmcoLikpDQoNCiNlc3RlIGVzdMOhIG1hbCAgDQojIGlwY192YXJpYWNpb24gPC0gIGlwYyAgJT4lIA0KIyAgIGZpbHRlcihtZXMgPT0gMSkgJT4lIA0KIyAgIG11dGF0ZShpcGNfdmFyID0gY2FtYmlvX3BvcmNlbnR1YWwoaXBjXzA3MDMpLA0KIyAgICAgICAgICBpcGNfdmFyPSBjYXNlX3doZW4oaXMubmEoaXBjX3ZhcikgfiAxLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGlwY192YXIpLA0KIyAgICAgICAgICAgaXBjXzAxNjIgPSBjYXNlX3doZW4oYW5pbyA9PSAxOTYyIH4gMSksDQojICAgICAgICAgIGlwY18wMTYyID0gbGFnKGlwY18wMTYyKStsYWcoaXBjXzAxNjIpKiBpcGNfdmFyKQ0KIyAgICAgICAgICANCiAgICAgICAgICMgaXBjXzAxNjIgPSBsYWcoaXBjXzAxNjIpICsgKGxhZyhpcGNfMDE2MikqIGlwY192YXIpKQ0KICAgICAgICAgIyBpcGNfMDE2MiA9IGNhc2Vfd2hlbiggaXMubmEoaXBjXzAxNjIpIH4gbGFnKGlwY18wMTYyKSArIGxhZyhpcGNfMDE2MikqaXBjX3ZhciApKQ0KDQoNCmlwY19wcm9tZWRpbyA8LSBpcGMgJT4lDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKGlwY18wMyA9IG1lYW4oaXBjXzA3MDMpKSAlPiUgDQogIG11dGF0ZShmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKGFuaW8gLCBvcmRlcnMgPSAieSIpKSwgDQogICAgICAgICBpcGNfNzAgPSBnZW5lcmFyX2luZGljZShzZXJpZSA9IGlwY18wMywgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhPSBmZWNoYSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9ICIxOTcwLTAxLTAxIiksDQogICAgICAgICBpcGNfMTggPSBnZW5lcmFyX2luZGljZShzZXJpZSA9IGlwY18wMywgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhPSBmZWNoYSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9ICIyMDE4LTAxLTAxIikpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBldmVyeXRoaW5nKC4pKQ0KDQp3cml0ZS5jc3YoaXBjX3Byb21lZGlvLCBmaWxlID0gIkM6L0FyY2hpdm9zL0RhdG9zL2luZGljZXMvaXBjX3Byb21lZGlvLmNzdiIpDQoNCiMgaXBjXzcwIDwtIGlwY192YXJpYWNpb24gJT4lIA0KIyAgIHNlbGVjdChmZWNoYSwgaXBjXzAxNzApICU+JSANCiMgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSANCiMgICAgICAgICAgICAgICBzZWxlY3QoZmVjaGEsIGlwY183MCkpDQoNCiMgSVBJTSBiYXNlIDE5OTMgPSAxMDANCiMgw41uZGljZSBkZSBwcmVjaW9zIGludGVybm9zIGFsIHBvciBtYXlvciAoSVBJTSkNCiMgw41uZGljZSBkZSBwcmVjaW9zIGludGVybm9zIGLDoXNpY29zIGFsIHBvciBtYXlvciAoSVBJQikNCiMgw41uZGljZSBkZSBwcmVjaW9zIGLDoXNpY29zIGRlbCBwcm9kdWN0b3IgKElQUCkNCnNpcG1fc2VyaWU1Nl85NSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9JTkRFQy9JUElNL3NpcG0tc2VyaWU1Ni05NS54bHMiLA0KICAgIHNraXAgPSA2KSAlPiUgDQogIHJlbmFtZShhbmlvID0gbWVzLA0KICAgICAgICAgaXBpbV9uaXZlbF9ncmFsID0gZ2VuZXJhbC4uLjIgLA0KICAgICAgICAgaXBpbV9uaXZlbF9uYWMgPSBuYWNpb25hbGVzLi4uMywNCiAgICAgICAgIGlwaW1fbml2ZWxfaW1wbyA9IEltcG9ydGFkb3MsDQogICAgICAgICBpcGliX25pdmVsX2dyYWwgPSBnZW5lcmFsLi4uNSAsDQogICAgICAgICBpcGliX25pdmVsX25hYyA9IG5hY2lvbmFsZXMuLi42LA0KICAgICAgICAgaXBpYl9uaXZlbF9pbXBvID0gaW1wb3J0YWRvcywNCiAgICAgICAgIGlwcF9uaXZlbF9ncmFsID0gZ2VuZXJhbC4uLjgpICU+JSANCiAgZmlsdGVyKGdyZXBsKCAiMTkiLCBhbmlvKSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkNCg0KaXBpbV9iYXNlOTQgPC0gc2lwbV9zZXJpZTU2Xzk1ICU+JSBtdXRhdGUoaXBpbV9uaXZlbF9ncmFsXzk0ID0gZ2VuZXJhcl9pbmRpY2UoaXBpbV9uaXZlbF9ncmFsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhID0gYW5pbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAxOTk0KSkgJT4lIA0KICBzZWxlY3QoYW5pbywgaXBpbV9uaXZlbF9ncmFsLCBpcGltX25pdmVsX2dyYWxfOTQpDQoNCiMgR2FuYW5jaWEgeSBwYmkgcGVzb3MgY29ycmllbnRlcyAoZnVlbnRlOiBKSUMvRU0gY29udGludWFjaW9uIEpJQykNCmdhbmFuY2lhX3lfcGJpIDwtIHJlYWRfZXhjZWwoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL2dhbmFuY2lhIHkgcGJpLnhsc3giKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCg0KYGBgDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMgRXN0aW1hY2lvbiBkZSBvdHJvcyBhdXRvcmVzDQojICoqRXN0aW1hY2nDs24gSksqKg0KcmVudGFfaGlkcm9jYXJidXJvc19qayA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9yZW50YV9oaWRyb2NhcmJ1cm9zX2prLnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIGZpbHRlcihpbmRpY2VfdGllbXBvIDw9IDIwMTkpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpICU+JSANCiAgcmVuYW1lKHByZWNpb19tZV9nYXMgPSBgR2FzIG5hdHVyYWwgbWVyY2FkbyBleHRlcm5vYCwNCiAgICAgICAgIHByZWNpb19taV9nYXMgPSBgcHJlY2lvIGludGVybm8gZ2FzIG5hdHVyYWxfcGVzb3NgLA0KICAgICAgICAgcHJlY2lvX21lX2NydWRvID0gYFByZWNpbyBjcnVkbyBtZXJjYWRvIGV4dGVybm9gLA0KICAgICAgICAgcHJlY2lvX21pX2NydWRvID0gYFByZWNpbyBjcnVkbyBtZXJjYWRvIGludGVybm9gLA0KICAgICAgICAgcHJlY2lvX2JvbGl2aWFfZ2FzX3VzZCA9IGBHYXMgTmF0dXJhbC4gUHJlY2lvIFZlbnRhIEJvbGl2aWEgYSBBcmdlbnRpbmEuLi4yNGAsIA0KICAgICAgICAgcHJlY2lvX2JvbGl2aWFfZ2FzX3Blc29zID0gYEdhcyBOYXR1cmFsLiBQcmVjaW8gVmVudGEgQm9saXZpYSBhIEFyZ2VudGluYS4uLjI1YCwNCiAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb19jcnVkbyA9YFJlbnRhIHBvciB2ZW50YSBjcnVkbyBlbiBlbCBtZXJjYWRvIGludGVybm8gcG9yIGRlYmFqbyAvIGFycmliYSBwcmVjaW8gaW50ZXJuYWNpb25hbGAsDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9fZ2FzID0gJ1JlbnRhIHBvciB2ZW50YSBnYXMgZW4gZWwgbWVyY2FkbyBpbnRlcm5vIHBvciBkZWJham8gLyBhcnJpYmEgcHJlY2lvIGludGVybmFjaW9uYWwnLA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gPSAnUmVudGEgY3J1ZG8gcG9yIGV4cG9ydGFjaW9uZXMgYSBwZXNvIHNvYnJldmFsdWFkbycsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMgPSAnUmVudGEgZ2FzIHBvciBleHBvcnRhY2lvbmVzJywNCiAgICAgICAgIHJldGVuY2lvbmVzID0gIlJldGVuY2lvbmVzIiwNCiAgICAgICAgIHJlZ2FsaWFzID0gYFJlZ2FsaWFzIHRvdGFsYCwNCiAgICAgICAgIHJlbnRhX3RvdGFsID0gJ1NVTUEgcmVudGEgb3Ryb3MgKHNpbiBpbXBvcnRhY2lvbmVzIG5pIHJldGVuY2lvbmVzKScpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9nYXMgPSAiTU1CVFUiLA0KICAgICAgICAgdW5pZGFkX2NydWRvID0gIkJhcnJpbGVzIiwNCiAgICAgICAgIHVuaWRhZF9yZW50YSA9ICJQZXNvcyBjb3JyaWVudGVzIikgJT4lIA0KICBzZWxlY3QoYW5pbyA9IGluZGljZV90aWVtcG8sIHVuaWRhZF9nYXMsIHVuaWRhZF9jcnVkbywgdW5pZGFkX3JlbnRhLA0KICAgICAgICAgcHJvZF9wZXRjcnUsIGV4cG9fY3J1ZG8sIGNydWRvX2ludGVybm8sDQogICAgICAgICBwcm9kX2dhc25hdCwgZXhwb19nYXMsIGdhc19pbnRlcm5vLA0KICAgICAgICAgcHJlY2lvX21lX2dhcyAsIHByZWNpb19taV9nYXMgLCBwcmVjaW9fbWVfY3J1ZG8sIHByZWNpb19taV9jcnVkbywgDQogICAgICAgICBwcmVjaW9fYm9saXZpYV9nYXNfdXNkICwgIHByZWNpb19ib2xpdmlhX2dhc19wZXNvcyAsIA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2NydWRvICwgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2dhcyAsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyAsIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyAsDQogICAgICAgICByZXRlbmNpb25lcywgcmVnYWxpYXMsIA0KICAgICAgICAgVENDLCBUQ1AsIA0KICAgICAgICAgcmVudGFfdG90YWwpICU+JQ0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcm9kX3BldGNydSIsICJleHBvX2NydWRvIiwgImNydWRvX2ludGVybm8iKSwgDQogICAgICAgICAgICAuZnVucyA9IGNvbnZlcnNvcl9tM2JibF9xKSAlPiUgDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19taV9jcnVkbyIsICJwcmVjaW9fbWVfY3J1ZG8iKSwNCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zYmJsX3ApICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYygicHJvZF9nYXNuYXQiLCAiZXhwb19nYXMiLCAiZ2FzX2ludGVybm8iKSwNCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zTU1CVFVfcSkgJT4lIA0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcmVjaW9fbWlfZ2FzIiwgInByZWNpb19ib2xpdmlhX2dhc19wZXNvcyIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNNTUJUVV9wKQ0KDQogIA0KcmVudGFfcHJlY2lvX2V4cG9fY3J1ZG9famsgPC0gcmVudGFfaGlkcm9jYXJidXJvc19qayAlPiUgDQogIHNlbGVjdChhbmlvLCBwcm9kX3BldGNydSwgZXhwb19jcnVkbywgY3J1ZG9faW50ZXJubywgDQogICAgICAgICBwcmVjaW9fbWlfY3J1ZG8sIHByZWNpb19tZV9jcnVkbywgVENDLCBUQ1AsIA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2NydWRvLCByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyApDQoNCg0KcmVudGFfcHJlY2lvX2V4cG9fZ2FzX2prIDwtIHJlbnRhX2hpZHJvY2FyYnVyb3NfamsgJT4lIA0KICBzZWxlY3QoYW5pbywgcHJvZF9nYXNuYXQsIGV4cG9fZ2FzLCBnYXNfaW50ZXJubywgDQogICAgICAgICBwcmVjaW9fbWlfZ2FzLCBwcmVjaW9fYm9saXZpYV9nYXNfcGVzb3MsIFRDQywgVENQLCANCiAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb19nYXMsIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyApDQoNCg0KI0VzdGltYWNpw7NuIEJpbGwgeSBGYXJmYXJvIFJ1aXoNCnJlbnRhX2hpZHJvY2FyYnVyb3NfZnIgPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvcmVudGFfaGlkcm9jYXJidXJvc19GUi54bHN4IiApICU+JQ0KICBzZWxlY3QoLXVuaWRhZCkgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSAiUmVnYWzDrWFzIiwNCiAgICAgICAgIHJldGVuY2lvbmVzID0gUmV0ZW5jaW9uZXMsDQogICAgICAgICBleHBvX3RjID0gIk1lZGlhbnRlIHNvYnJldmFsdWFjacOzbiBwYXJhIGV4cG9ydCIsDQogICAgICAgICBkaWZfcHJlY2lvcyA9ICJNZWRpYW50ZSBkaWZlcmVuY2lhIHByZWNpbyBpbnRlcm5vIGNvbiBpbnRlcm5hYyIpICU+JQ0KICBncm91cF9ieShhbmlvICwgaXBjXzA4KSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3ggLyAxMF4zfSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lDQogIG11dGF0ZShyZWdhbGlhcyA9cmVnYWxpYXMgKiBpcGNfMDggL2lwY18xOCwNCiAgICAgICAgIHJldGVuY2lvbmVzID1yZXRlbmNpb25lcyAqIGlwY18wOCAvaXBjXzE4LA0KICAgICAgICAgZXhwb190YyA9ZXhwb190YyAqIGlwY18wOCAvaXBjXzE4LA0KICAgICAgICAgZGlmX3ByZWNpb3MgPWRpZl9wcmVjaW9zICogaXBjXzA4IC9pcGNfMTgsDQogICAgICAgICByZW50YV90b3RhbCA9IHJlZ2FsaWFzKyByZXRlbmNpb25lcysgZXhwb190YysgZGlmX3ByZWNpb3MsDQogICAgICAgICB1bmlkYWQgPSAibWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KC1pcGNfMDgpIA0KcmVudGFfaGlkcm9jYXJidXJvc19mcg0KDQojb3Ryb3MgYXV0b3Jlcw0KcmVudGFfYXV0b3JlcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIGNhbGN1bG8gcmVudGEgb3Ryb3MvcmVudGFfYXV0b3Jlcy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpDQoNCg0KYGBgDQoNCg0KIyBWYXJpYWJsZXMNCg0KIyMgUHJvZHVjY2nDs24NCg0KRnVlbnRlczogDQoNCiogW01pbmlzdGVyaW8gZGUgSGFjaWVuZGEsIEluZm9ybWVzDQpTZWN0b3JpYWxlc10oaHR0cHM6Ly93d3cuYXJnZW50aW5hLmdvYi5hci9lY29ub21pYS9wb2xpdGljYWVjb25vbWljYS9yZWdpb25hbHlzZWN0b3JpYWwvaW5mb3JtZXNwcm9kdWN0aXZvcykgKDE5OTgtaG95KS4gDQoqIFtTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAtIFJlZ2FsaWFzXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvcmVnYWxpYXMtZGUtcGV0cm9sZW8tY3J1ZG8tZ2FzLW5hdHVyYWwtZ2xwLWdhc29saW5hLXktY29uZGVuc2FkbykgKDE5OTgtaG95KQ0KKiBbU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgLSBTRVNDTyBEb3duc3RyZWFtXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvcHJvZHVjY2lvbi1kZS1wZXRyb2xlby15LWdhcy10YWJsYXMtZGluYW1pY2FzKSgxOTkzLWhveSkNCiogW0FudWFyaW8gZGUgY29tYnVzdGlibGVzXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvYW51YXJpb3MtZGUtY29tYnVzdGlibGVzLTE5NTAtMTk5OSkgKDE5MTEtMTk5MikNCiogS296dWxqIHkgUGlzdG9uZXNpLiBSZXZpc3RhICBkZWwgSW5zdGl0dXRvIGRlIEVjb25vbcOtYSBFbmVyZ8OpdGljYSAoSURFRSkgLSBGdW5kYWNpw7NuIEJhcmlsb2NoZSAgKDE5NzAgLSAxOTg4KQ0KKiBbRUlBXShodHRwczovL3d3dy5laWEuZ292L2ludGVybmF0aW9uYWwvZGF0YS9jb3VudHJ5L0FSRy9wZXRyb2xldW0tYW5kLW90aGVyLWxpcXVpZHMvYW5udWFsLXBldHJvbGV1bS1hbmQtb3RoZXItbGlxdWlkcy1wcm9kdWN0aW9uP3BkPTUmcD0wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwdmcmdT0wJmY9QSZ2PW1hcGJ1YmJsZSZhPS0maT1ub25lJnZvPXZhbHVlJiZ0PUMmZz1ub25lJmw9MjQ5LS02JnM9OTQ2OTQ0MDAwMDAmZT0xNTQ2MzAwODAwMDAwKSAoMTk4MCAtIDIwMTkpDQoNCiMjIyBQcm9kdWNjacOzbiBkZSBDcnVkbw0KDQoqKnBvbmVyIGVuIGN1YW50byBubyBjb2luY2lkZSwgY3VhbnRvIGVzdGEgcG9yIGVuY2ltYSBvIHBvciBkZWJham8sIGJyZWNoYSwgZXhwbGljYXIgZW4gcXXDqSBhw7FvIHNlIGhhY2UgZWwgZW1wYWxtZSBlbiBsb3MgcHJlY2lvcyAqKg0KDQpMYSBwcm9kdWNjacOzbiBkZSBwZXRyw7NsZW8gY3J1ZG8gZGUgbGFyZ28gcGxhem8gcHJvdmllbmUgZGVsIEFudWFyaW8gZGUgQ29tYnVzdGlibGVzLCBkZSBsYSBjdWFsIGNvbnRhbW9zIGRhdG9zIGRlc2RlIDE5MTEgaGFzdGEgMTk5Mi4gU3VzIHZhbG9yZXMgcGFyYSBlbCBwZXLDrW9kbyAxOTgwLTE5OTIgY29pbmNpZGVuIGNvbiBsb3MgZGUgRUlBLCBwb3IgbG8gY3VhbCBwdWVkZW4gdXNhcnNlIGNvbW8gZnVlbnRlcyBhbHRlcm5hdGl2YXMuIEFzaW1pc21vLCBsYSBldm9sdWNpw7NuIGRlIFNFU0NPIGVzIHNpbWlsYXIgYSBsYSBkZSBFSUEsIHNhbHZvIHBvciBwZXF1ZcOxYXMgZGl2ZXJnZW5jaWFzIGVudHJlIDIwMDggeSAyMDEzLiBMYSBzZXJpZSBkZSBSZWdhbMOtYXMgcHJlc2VudGEgdW4gbml2ZWwgbWVub3IgcXVlIGxhcyBhbnRlcmlvcmVzIGRlYmlkbyBhIGxhcyBkZWR1Y2Npb25lcyBkZSBwcm9kdWNjacOzbiBxdWUgcmVhbGl6YW4gbGFzIGVtcHJlc2FzIHBhcmEgcGFnYXIgdW4gbWVub3Igbml2ZWwgZGUgUmVnYWzDrWFzIGhhY2lhIGxhcyBwcm92aW5jaWFzIGRvbmRlIHJlYWxpemFuIGxhIHByb2R1Y2Npw7NuLiBQb3Igw7psdGltbywgbGEgc2VyaWUgZGVsIE1pbmlzdGVyaW8gZGUgRWNvbm9tw61hIGNvaW5jaWRlIGNvbiBSZWdhbMOtYXMgZW4gc3VzIHByaW1lcm9zIGHDsW9zLCBsdWVnbyBwcmVzZW50YSB1biBuaXZlbCBpbnRlcm1lZGlvIGVudHJlIFJlZ2Fsw61hcyB5IFNFU0NPIHkgYSBwYXJ0aXIgZGUgMjAwOSB0b21hIGEgU0VTQ08gY29tbyBmdWVudGUuIFNhbHZvIGVsIEFudWFyaW8gZGUgQ29tYnVzdGlibGVzLCBlbCByZXN0byBkZSBsYXMgc2VyaWVzIHByZXNlbnRhbiBkYXRvcyBoYXN0YSBsb3Mgw7psdGltb3MgYcOxb3MuIFBvciBsbyB0YW50bywgZWwgY3JpdGVyaW8gZGUgc2VsZWNjacOzbiBwYXJhIGxhIHNlcmllIGRlIHByb2R1Y2Npw7NuIGNvbiBsYSBxdWUgc2UgcmVhbGl6YXLDoW4gbG9zIGPDoWxjdWxvcyBlcyBlbCBzaWd1aWVudGU6DQoNCiogQ3JpdGVyaW8gZGUgY8OzbXB1dG8gcGFyYSBwcm9kdWNpY8OzbiBkZSBjcnVkbzogDQogICsgMTkxMSBhIDE5OTI6IEFudWFyaW8gZGUgY29tYnVzdGlibGVzIA0KICArIDE5OTMgLSBhY3R1YWxpZGFkOiBTRVNDTyBEb3duc3RyZWFtDQoNCg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyBQUk9DRVNBUiBFU1RBIEJBU0UNCm1lY29uX2hpZHJvY2FyYnVyb3NfZGYgPC0gIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lY29uL2hpZHJvY2FyYnVyb3MuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhpbmRpY2VfdGllbXBvID0gY29sX2RhdGUoZm9ybWF0ID0gIiVkLyVtLyVZIikpLCANCiAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAiSVNPLTg4NTktMSIpKQ0KdW5pcXVlKG1lY29uX2hpZHJvY2FyYnVyb3NfZGYkaW5kaWNhZG9yKQ0KDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojQW51YXJpbyBkZSBjb21idXN0aWJsZXMNCnByb2RfYW51YXJpbyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Byb2R1Y2Npb24vUHJvZHVjY2lvbl9EZXNkZV8xOTExIC0gY29waWEueGxzIikgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw5FPIiwgY3J1ZG9fYW51YXJpb19NbTMgPSAiUEVUUk9MRU8gKE1tMykiLCANCiAgZ2FzX2ggPSBgR0FTIE5BVFVSQUwgKE1pbGwuIG0zKWAsIGNhcmJvbl9oID0gYENBUkJPTiAoTVRuKSAoKilgKSAlPiUgDQogIG11dGF0ZShnYXNfYW51YXJpb19NTW0zICAgPSBhcy5kb3VibGUoZ2FzX2gpLCANCiAgICAgICAgIGNhcmJvbl9hbnVhcmlvX010biAgID0gYXMuZG91YmxlKGNhcmJvbl9oKSwNCiAgICAgICAgIGNydWRvX2FudWFyaW8gPSBjcnVkb19hbnVhcmlvX01tMyAqIDEwMDApICU+JSANCiAgc2VsZWN0KGFuaW8sIGNydWRvX2FudWFyaW8sIGdhc19hbnVhcmlvX01NbTMsIGNhcmJvbl9hbnVhcmlvX010biApDQoNCiMgUmV2aXN0YSBJREVFDQojIFByb2R1Y2Npw7NuIGNydWRvIHBvciBhZG1pbmlzdHJhY2nDs24geSBjb250cmF0b3MNCmN1YWRyb18yLjEgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIHBldHJvbGVvIGNydWRvIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg5Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSAxKSAlPiUgDQogIHJlbmFtZSh1bmlkYWQgPSAiLi4uNSIpDQoNCiNiYXNlIE1pbmlzdGVyaW8gZGUgSGFjaWVuZGENCmhpZHJvY2FyYnVyb3NfYmFzZV9tZWNvbiA8LSAgcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVjb24vZGF0YXNldHMgdmllam9zL2hpZHJvY2FyYnVyb3MuY3N2IiwgDQogICAgbG9jYWxlID0gbG9jYWxlKGRhdGVfbmFtZXMgPSAiZXMiLCBlbmNvZGluZyA9ICJJU08tODg1OS0xIikpICU+JSANCiAgbXV0YXRlKGZlY2hhID0gYXMuRGF0ZShsdWJyaWRhdGU6OnBhcnNlX2RhdGVfdGltZShpbmRpY2VfdGllbXBvLCBvcmRlcnMgPSAiZG15IikpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgZXZlcnl0aGluZyguKSwgLWMoMTozLCBmdWVudGUsIGluZGljZV90aWVtcG8sYWxjYW5jZV9pZCkpDQoNCiNsaXN0YSBjb24gaW5kaWNhZG9yZXMNCmxpc3RhX2ZpbHRybyA8LSB1bmlxdWUoaGlkcm9jYXJidXJvc19iYXNlX21lY29uJGluZGljYWRvcikNCg0KDQpwcm9kX21lY29uX2NydWRvIDwtIGhpZHJvY2FyYnVyb3NfYmFzZV9tZWNvbiAlPiUgDQogIGZpbHRlciggaW5kaWNhZG9yID09IGxpc3RhX2ZpbHRyb1szXSwNCiAgICAgICAgIGFjdGl2aWRhZF9wcm9kdWN0b19ub21icmUgPT0gIlBldHLDs2xlbyBjcnVkbyIsDQogICAgICAgICBmcmVjdWVuY2lhX25vbWJyZSA9PSAiTWVuc3VhbCIpICU+JSAgDQogIG11dGF0ZShhbmlvID0geWVhcihmZWNoYSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgYWN0aXZpZGFkX3Byb2R1Y3RvX25vbWJyZSwgaW5kaWNhZG9yLCB1bmlkYWRfZGVfbWVkaWRhKSAlPiUgDQogIHN1bW1hcmlzZShjcnVkb19tZWNvbiA9IHN1bSh2YWxvcikpDQoNCg0KI0Jhc2UgcmVnYWxpYXMNCnByb2RfcmVnYWxpYXNfY3J1ZG8gPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZWdhbGlhcy9wcm9kdWNjaW9uX2NydWRvX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw5FPIikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIm0zIiwNCiAgICAgICAgIGFuaW8gPXpvbzo6bmEubG9jZihhbmlvKSwNCiAgICAgICAgIGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUocGFzdGUwKGFuaW8sIE1FUyksIG9yZGVycyA9ICJ5bSIpKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIE1FUywgYW5pbywgdW5pZGFkLCAiVE9UQUwgQ1VFTkNBIiwgZXZlcnl0aGluZyguKSkgJT4lIA0KICByZW5hbWUocHJvZF9jcnVkb19tMyA9ICJUT1RBTCBDVUVOQ0EiKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCApICU+JSANCiAgc3VtbWFyaXNlKGNydWRvX3JlZ2FsaWFzID0gc3VtKHByb2RfY3J1ZG9fbTMpKQ0KDQojQmFzZSBTRVNDTyAuY3N2ICAoUHJlIDIwMDkpDQpwcm9kX3Nlc2NvX2NydWRvX2EgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vcHJvZHVjY2luLWRlLXBldHJsZW8tYW50ZXJpb3ItYWwtMjAwOS5jc3YiKSAlPiUNCiAgc2VsZWN0KGFuaW8sIG1lcyxpZGNvbmNlcHRvLCBjb25jZXB0bywgQ2FudGlkYWQgKSAlPiUNCiAgcmVuYW1lKGNhbnRpZGFkID0gQ2FudGlkYWQpICU+JQ0KICAjIGZpbHRlcighaWRjb25jZXB0byAlaW4lIGMoNCwgNSwgNywgOCwgOQkpKSAlPiUNCiAgZmlsdGVyKGlkY29uY2VwdG8gJWluJSBjKDEsMiwzLCA2KSkgJT4lDQogIGdyb3VwX2J5KGFuaW8pICU+JQ0KICBzdW1tYXJpc2UoY3J1ZG9fc2VzY28gPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIm0zIikNCg0KIyBCYXNlIFNFU0NPIChQb3N0IDIwMDkpDQpwcm9kX3Nlc2NvX2NydWRvX2IgPC0gcmVhZF9jc3YoDQogICJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1NFU0NPL3Byb2R1Y2Npbi1kZS1wZXRybGVvLXBvci15YWNpbWllbnRvLmNzdiIpICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcyxpZGNvbmNlcHRvLCBjb25jZXB0bywgY2FudGlkYWQgKSAlPiUNCiAgIyBmaWx0ZXIoIWlkY29uY2VwdG8gJWluJSBjKDQsIDUsIDcsIDgsIDkJKSkgJT4lDQogIGZpbHRlcihpZGNvbmNlcHRvICVpbiUgYygxLDIsMywgNikpJT4lDQogIGdyb3VwX2J5KGFuaW8pICU+JQ0KICBzdW1tYXJpc2UoY3J1ZG9fc2VzY28gPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIm0zIikNCg0KcHJvZF9zZXNjb19jcnVkbyA8LSBwcm9kX3Nlc2NvX2NydWRvX2EgJT4lIA0KICBiaW5kX3Jvd3MocHJvZF9zZXNjb19jcnVkb19iKQ0KDQojRUlBDQoNCiN1bmlkYWQgb3JpZ2luYWwgPSBiYXJyZWxzIHBlciBkYXkNCg0KIyBUb3RhbCBQZXRyb2xldW0gYW5kIG90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbiA9IENydWRlIG9pbCwgTkdQTCwgYW5kIG90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbiArIFJlZmluZXJ5IHByb2Nlc3NpbmcgZ2Fpbg0KIyBDcnVkZSBvaWwsIE5HUEwsIGFuZCBvdGhlciBsaXF1aWRzIHByb2R1Y3Rpb24gPSBDcnVkZSBvaWwgaW5jbHVkaW5nIGxlYXNlIGNvbmRlbnNhdGUgcHJvZHVjdGlvbiArIE5hdHVyYWwgZ2FzIHBsYW50IGxpcXVpZHMgcHJvZHVjdGlvbiArIE90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbg0KDQpwcm9kX2VpYV9jcnVkbyA8LSAgcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0VJQS9kYXRhL29pbF9wcm9kdWN0aW9uX2FyZy5jc3YiLCANCiAgICB0cmltX3dzID0gRkFMU0UsIHNraXAgPSAxKSAlPiUgDQogIGZpbHRlcighaXMubmEoQVBJKSkgJT4lIA0KICBzZWxlY3QoLUFQSSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9IGFuaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjpuY29sKC4pKSAlPiUgDQogIHNwcmVhZCguLA0KICAgICAgICAga2V5ID0gWDIsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yKSAlPiUgDQogIHJlbmFtZSh0b3RhbF9vaWxfYW5kX290aGVyID0gYCAgICAgICAgVG90YWwgcGV0cm9sZXVtIGFuZCBvdGhlciBsaXF1aWRzIChNYi9kKWAsDQogICAgICAgICBjcnVkZV9vaWxfY29uZGVuc2F0ZSA9IGAgICAgICAgICAgICAgICAgQ3J1ZGUgb2lsIGluY2x1ZGluZyBsZWFzZSBjb25kZW5zYXRlIChNYi9kKWAsDQogICAgICAgICBuYXR1cmFsX2dhcyA9IGAgICAgICAgICAgICAgICAgTkdQTCAoTWIvZClgLA0KICAgICAgICAgb3RoZXJfbGlxdWlkcyA9IGAgICAgICAgICAgICAgICAgT3RoZXIgbGlxdWlkcyAoTWIvZClgLA0KICAgICAgICAgY3J1ZGVfb2lsX25ncGxfb3RoZXJfbGlxdWlkcyA9IGAgICAgICAgICAgICBDcnVkZSBvaWwsIE5HUEwsIGFuZCBvdGhlciBsaXF1aWRzIChNYi9kKWAsDQogICAgICAgICByZWZpbmVyeV9wcm9jZXNzaW5nX2dhaW4gPSBgICAgICAgICAgICAgUmVmaW5lcnkgcHJvY2Vzc2luZyBnYWluIChNYi9kKWApICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gKGMoImNydWRlX29pbF9jb25kZW5zYXRlIiwgIm5hdHVyYWxfZ2FzIiwgIm90aGVyX2xpcXVpZHMiLCANCiAgICAgICAgICAgICAgICAgICJjcnVkZV9vaWxfbmdwbF9vdGhlcl9saXF1aWRzIiwgInJlZmluZXJ5X3Byb2Nlc3NpbmdfZ2FpbiIgICwidG90YWxfb2lsX2FuZF9vdGhlciIpKSwNCiAgICAuZnVucyA9IGZ1bmN0aW9uKHgpIHt4ICogMzY1ICogMTAwMH0pICU+JSANCiAgbXV0YXRlKGFuaW8gPSBhcy5kb3VibGUoYW5pbyksDQogICAgICAgICB1bmlkYWQgPSAiYmFycmlsZXMiKQ0KDQojRUlBIGFsbCBkYXRhDQplaWFfYWxsX2RhdGEgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0VJQS9kYXRhL2FyZ2VudGluYS9JTlQtRXhwb3J0LTA5LTE3LTIwMjBfMTEtMTUtMTYuY3N2IiwgDQogICAgc2tpcCA9IDEpDQoNCg0KIyBDb21wYXJhY2nDs24gZW50cmUgc2VyaWVzDQpwcm9kX21lcmdlX2NydWRvIDwtICBwcm9kX3JlZ2FsaWFzX2NydWRvICU+JSANCiAgbGVmdF9qb2luKHByb2RfbWVjb25fY3J1ZG8gICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNydWRvX21lY29uKSkgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGNydWRvX3JlZ2FsaWFzLCBjcnVkb19tZWNvbikgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9zZXNjb19jcnVkbykgJT4lIA0KICBmdWxsX2pvaW4ocHJvZF9hbnVhcmlvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNydWRvX2FudWFyaW8pICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKHVuaWRhZCA9ICJtMyIpKSAlPiUgDQogICMgbXV0YXRlKGRpZiA9ICBjcnVkb19yZWdhbGlhcy9jcnVkb19tZWNvbi0xKSAlPiUgDQogIG11dGF0ZV9hdCgudmFycyA9IGMoICAgImNydWRvX3JlZ2FsaWFzIiAsImNydWRvX21lY29uIiwgICANCiAgICAgICAgICAgICAgICAgICAgICAgImNydWRvX3Nlc2NvIiwgICAgImNydWRvX2FudWFyaW8iICksIA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNiYmxfcSkgJT4lICANCiAgbGVmdF9qb2luKHByb2RfZWlhX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNydWRvX2VpYSA9IGNydWRlX29pbF9jb25kZW5zYXRlKSkgJT4lIA0KICAgbXV0YXRlKHByb2RfY3J1ZG8gPSAgY2FzZV93aGVuKGFuaW8gPCAxOTkzIH4gY3J1ZG9fYW51YXJpbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID4gMTk5MiB+IGNydWRvX3Nlc2NvKSwNCiAgICAgICAgICB1bmlkYWQgPSAiYmFycmlsZXMiLCANCiAgICAgICAgICB2YXJpYWJsZSA9ICAiUHJvZHVjY2nDs24gZGUgY3J1ZG8gc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIikgICU+JQ0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgc2VsZWN0KGFuaW8sIHZhcmlhYmxlLCB1bmlkYWQsIHByb2RfY3J1ZG8sIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgcmVuYW1lKHJlZ2FsaWFzID0gY3J1ZG9fcmVnYWxpYXMsDQogICAgICAgICBtZWNvbiA9IGNydWRvX21lY29uLA0KICAgICAgICAgc2VzY28gPSBjcnVkb19zZXNjbywNCiAgICAgICAgIGFudWFyaW9fY29tYnVzdGlibGVzID0gY3J1ZG9fYW51YXJpbywNCiAgICAgICAgIGVpYSA9IGNydWRvX2VpYSkgJT4lIA0KICBmaWx0ZXIoYW5pbyA8IDIwMjEpDQoNCg0KIyB3cml0ZS5jc3YocHJvZF9tZXJnZV9jcnVkbywgZmlsZSA9ICJyZXN1bHRhZG9zL3Byb2R1Y2Npb25fY3J1ZG8uY3N2IikNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcm9kX21lcmdlX2NydWRvLCANCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvcHJvZHVjY2lvbl9jcnVkby54bHN4IikNCg0KI2RpZmVyZW5jaWEgcHJvbWVkaW8gZGVsIDYlIGVudHJlIGxhcyBiYXNlcyAoZXMgbWF5b3IgbGEgZGUgbWVjb24pDQojIHN1bW1hcnkocHJvZF9tZXJnZV9jcnVkbykNCg0KDQojRXhpc3RlbmNpYXMNCmV4aXN0ZW5jaWFzX3BldHJvbGVvIDwtIHJlYWRfZXhjZWwoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL2V4aXN0ZW5jaWFzX2NydWRvLnhsc3giKSAlPiUNCiAgZmlsdGVyKCEoaXMubmEoZXhpc3RlbmNpYXMgKSkpICU+JSANCiAgcmVuYW1lKGV4aXN0ZW5jaWFzX2NydWRvID0gZXhpc3RlbmNpYXMpICU+JSANCiAgbXV0YXRlKGV4aXN0ZW5jaWFzX2NydWRvID0gY29udmVyc29yX20zYmJsX3EoZXhpc3RlbmNpYXNfY3J1ZG8pLA0KICAgICAgICAgdW5pZGFkID0gImJhcnJpbGVzIikNCg0KIyBwbG90KGV4aXN0ZW5jaWFzX3BldHJvbGVvJGFuaW8sIGV4aXN0ZW5jaWFzX3BldHJvbGVvJGV4aXN0ZW5jaWFzX2NydWRvKQ0KDQpgYGANCg0KPGJyPg0KKipUYWJsYSAxLiBQcm9kdWNjacOzbiBkZSBwZXRyw7NsZW8gY3J1ZG8gZW4gQXJnZW50aW5hIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyAoYmFycmlsZXMpKioNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwcm9kX21lcmdlX2NydWRvICU+JSANCiAgc2VsZWN0KC1wcm9kX2NydWRvKQ0KIA0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdGx5KHByb2RfbWVyZ2VfY3J1ZG8gJT4lIA0KICBtdXRhdGUocmVnYWxpYXMgPSBjYXNlX3doZW4ocmVnYWxpYXMgPT0gMCB+IE5BX3JlYWxfLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHJlZ2FsaWFzKSkgJT4lDQogICAgc2VsZWN0KC1wcm9kX2NydWRvKSAlPiUgDQogIGdhdGhlcihrZXkgPSBmdWVudGUsIHZhbHVlID0gdmFsb3IsIDQ6bmNvbCguKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGZ1ZW50ZSkpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyAxLiBQcm9kdWNjacOzbiBkZSBwZXRyw7NsZW8gY3J1ZG8uDQogICAgICAgIEFyZ2VudGluYSAoMTkxMSAtIDIwMjApIiwNCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIEJhcnJpbGVzIiwNCiAgICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogZWxhYm9yYWNpw7NuIHByb3BpYSBlbiBiYXNlIGEgQW51YXJpbyBkZSBDb21idXN0aWJsZXMsIEVJQSwgTWluaXN0ZXJpbyBkZSBFY29ub23DrWEsIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIChCYXNlIFJlZ2Fsw61hcyB5IFNFU0NPKSIpKw0KICAjIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6dW5pdF9mb3JtYXQodW5pdCA9IiIsIHNjYWxlID0gMWUtNikpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiksIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQogICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgIA0KYGBgDQoNCg0KDQojIyMgUHJvZHVjY2nDs24gZGUgR2FzIE5hdHVyYWwNCg0KQWwgaWd1YWwgcXVlIGVuIGxhIHByb2R1Y2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkbywgbGEgc2VyaWUgZGUgbGFyZ28gcGxhem8gZGUgcHJvZHVjY2nDs24gZGUgZ2FzIHByb3ZpZW5lIGRlbCBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgZGUgbGEgY3VhbCBjb250YW1vcyBkYXRvcyBkZXNkZSAxOTEzIGhhc3RhIDE5OTIuIEEgZGlmZXJlbmNpYSBkZWwgY3J1ZG8sIHN1cyB2YWxvcmVzIHBhcmEgZWwgcGVyw61vZG8gMTk4MC0xOTkyIG5vIGNvaW5jaWRlbiBjb24gbG9zIGRlIEVJQSwgcGVybyBlc3TDoSDDumx0aW1hIHPDrSBjb2luY2lkZSBjb24gbG9zIGRlIFJlZ2Fsw61hcyBlbnRyZSAxOTk5IHkgMjAxNS4gRW4gY2FtYmlvLCBsYSBzZXJpZSBkZSBTRVNDTywgdGllbmRlIGEgY29udGludWFyIGxhIGV2b2x1Y2nDs24gZGUgRUlBIHkgUmVnYWzDrWFzLCBwZXJvIGNvbiBlbCBuaXZlbCBkZWwgQW51YXJpbyBkZSBDb21idXN0aWJsZXMsIHBvciBsbyBxdWUgYW1ib3MgcGFyZXMgZGUgc2VyaWVzIHB1ZWRlbiBlbXBhbG1hciBjb2hlcmVudGVtZW50ZSBzZWfDum4gc3Ugbml2ZWwuIE51ZXZhbWVudGUsIGxvcyB2YWxvcmVzIGRlIGxhIGJhc2UgZGUgUmVnYWzDrWFzIHNvbiBtZW5vcmVzIGRlYmlkbyBhIGxhcyBkZWR1Y2Npb25lcyBkZSBwcm9kdWNjacOzbiBwYXJhIHRyaWJ1dGFyIG1lbm9zIHJlZ2Fsw61hcy4gTGEgc2VyaWUgZGVsIE1pbmlzdGVyaW8gZGUgRWNvbm9tw61hIHRvbWEgbG9zIHZhbG9yZXMgZGUgU0VTQ08uUG9yIGxvIHRhbnRvLCBlbCBjcml0ZXJpbyBkZSBzZWxlY2Npw7NuIHBhcmEgbGEgc2VyaWUgZGUgcHJvZHVjY2nDs24gZGUgZ2FzIHBhcmEgbG9zIGPDoWxjdWxvcyBlcyBlbCBzaWd1aWVudGU6DQoNCiogQ3JpdGVyaW8gZGUgY8OzbXB1dG8gZGUgbGEgcHJvZHVjY2nDs24gZGUgZ2FzOg0KICArIDE5MTEgYSAxOTkyOiBBbnVhcmlvIGRlIGNvbWJ1c3RpYmxlcyANCiAgKyAxOTkzIGVuIGFkZWxhbnRlOiBTRVNDTyBEb3duc3RyZWFtDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojQmFzZSBNRUNPTg0KcHJvZF9tZWNvbl9nYXMgPC0gaGlkcm9jYXJidXJvc19iYXNlX21lY29uICU+JSANCiAgZmlsdGVyKGluZGljYWRvciA9PSBsaXN0YV9maWx0cm9bM10sDQogICAgICAgICBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlID09ICJHYXMgbmF0dXJhbCIsDQogICAgICAgICBmcmVjdWVuY2lhX25vbWJyZSA9PSAiTWVuc3VhbCIpICU+JSAgDQogIG11dGF0ZShhbmlvID0geWVhcihmZWNoYSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgYWN0aXZpZGFkX3Byb2R1Y3RvX25vbWJyZSwgaW5kaWNhZG9yLCB1bmlkYWRfZGVfbWVkaWRhKSAlPiUgDQogIHN1bW1hcmlzZShnYXNfbWVjb24gPSBzdW0odmFsb3IpKQ0KDQojQmFzZSByZWdhbGlhcw0KcHJvZF9yZWdhbGlhc19nYXMgPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZWdhbGlhcy9wcm9kdWNjaW9uX2dhc19yZWdhbGlhcy5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIsDQogICAgICAgICBhbmlvID0gem9vOjpuYS5sb2NmKGFuaW8pLA0KICAgICAgICAgZmVjaGEgPSBhcy5EYXRlKHBhcnNlX2RhdGVfdGltZShwYXN0ZTAoYW5pbywgTUVTKSwgb3JkZXJzID0gInltIikpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgdW5pZGFkLCAiVE9UQUwgQ1VFTkNBIiwgZXZlcnl0aGluZyguKSkgJT4lIA0KICByZW5hbWUocHJvZF9nYXNfTW0zID0gIlRPVEFMIENVRU5DQSIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkICkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICBzdW1tYXJpc2UoZ2FzX3JlZ2FsaWFzID0gc3VtKHByb2RfZ2FzX01tMykpDQoNCiNCYXNlIFNFU0NPDQojcHJlIDIwMDkNCnByb2Rfc2VzY29fZ2FzX2EgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vcHJvZHVjY2luLWRlLWdhcy1hbnRlcmlvci1hbC0yMDA5LmNzdiIpICAlPiUgDQogIHNlbGVjdChhbmlvLCBtZXMsaWRjb25jZXB0bywgY29uY2VwdG8sIENhbnRpZGFkICkgJT4lDQogIHJlbmFtZShjYW50aWRhZCA9IENhbnRpZGFkKSAlPiUNCiAgZmlsdGVyKGlkY29uY2VwdG8gIT0gNCkgJT4lDQogIGdyb3VwX2J5KGFuaW8pICU+JQ0KICBzdW1tYXJpc2UoZ2FzX3Nlc2NvID0gc3VtKGNhbnRpZGFkLCBuYS5ybSA9IFQpKSAlPiUNCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIpDQoNCiNwb3N0IDIwMDkNCnByb2Rfc2VzY29fZ2FzX2IgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vcHJvZHVjY2luLWRlLWdhcy1wb3IteWFjaW1pZW50by5jc3YiKSAlPiUgDQogIHNlbGVjdChhbmlvLCBtZXMsaWRjb25jZXB0bywgY29uY2VwdG8sIGNhbnRpZGFkICkgJT4lDQogIGZpbHRlcihpZGNvbmNlcHRvICVpbiUgYygxLDIsMykpJT4lDQogIGdyb3VwX2J5KGFuaW8pICU+JQ0KICBzdW1tYXJpc2UoZ2FzX3Nlc2NvID0gc3VtKGNhbnRpZGFkLCBuYS5ybSA9IFQpKSAlPiUNCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIpDQoNCnByb2Rfc2VzY29fZ2FzIDwtIHByb2Rfc2VzY29fZ2FzX2EgJT4lDQogIGJpbmRfcm93cyhwcm9kX3Nlc2NvX2dhc19iKQ0KDQoNCiNFSUENCnByb2RfZWlhX2RyeV9uYXR1cmFsX2dhcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvRUlBL2RhdGEvRHJ5X25hdHVyYWxfZ2FzX3Byb2R1Y3Rpb25fQXJnZW50aW5hX0FubnVhbC5jc3YiLCANCiAgICBza2lwID0gNCkgICU+JSANCiAgcmVuYW1lKGFuaW8gPSBZZWFyLA0KICAgICAgICAgcHJvZF9laWEgPSBgU2VyaWVzIElEOiBJTlRMLjI2LTEtQVJHLUJDRi5BIGJpbGxpb24gY3ViaWMgZmVldGApICU+JSANCiAgbXV0YXRlKHByb2RfZWlhID0gY29udmVyc29yX2Z0M20zX3EocHJvZF9laWEgKiAxMDAwMDAwKSwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIpDQoNCg0KIyBDb21wYXJhY2nDs24gZW50cmUgc2VyaWVzDQpwcm9kX21lcmdlX2dhcyA8LSAgcHJvZF9yZWdhbGlhc19nYXMgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9tZWNvbl9nYXMgICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGdhc19tZWNvbikpICU+JQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBnYXNfcmVnYWxpYXMsIGdhc19tZWNvbikgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9zZXNjb19nYXMpICU+JSAgDQogIGZ1bGxfam9pbihwcm9kX2FudWFyaW8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZ2FzX2FudWFyaW8gPSBnYXNfYW51YXJpb19NTW0zICkgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoZ2FzX2FudWFyaW8gPSBnYXNfYW51YXJpbyAqIDEwMDAsDQogICAgICAgICAgICAgICAgICAgICB1bmlkYWQgPSAiTWlsZXMgZGUgbTMiKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9laWFfZHJ5X25hdHVyYWxfZ2FzICU+JSByZW5hbWUoZ2FzX2VpYSA9IHByb2RfZWlhKSkgJT4lIA0KICBtdXRhdGUocHJvZF9nYXMgPSBjYXNlX3doZW4oYW5pbyA8IDE5OTMgfiBnYXNfYW51YXJpbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID4gMTk5MiB+IGdhc19zZXNjbyksDQogICAgICAgICAgdmFyaWFibGUgPSAgIlByb2R1Y2Npw7NuIGRlIGdhcyBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMiKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBzZWxlY3QoYW5pbywgdmFyaWFibGUsIHVuaWRhZCwgcHJvZF9nYXMsIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgIGZpbHRlcighaXMubmEocHJvZF9nYXMpKSAlPiUgDQogIHJlbmFtZShyZWdhbGlhcyA9IGdhc19yZWdhbGlhcywNCiAgICAgICAgIG1lY29uID0gZ2FzX21lY29uLA0KICAgICAgICAgc2VzY28gPSBnYXNfc2VzY28sDQogICAgICAgICBhbnVhcmlvX2NvbWJ1c3RpYmxlcyA9Z2FzX2FudWFyaW8sDQogICAgICAgICBlaWEgPSBnYXNfZWlhKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KDQojIHdyaXRlLmNzdihwcm9kX21lcmdlX2dhcywgZmlsZSA9ICJyZXN1bHRhZG9zL3Byb2R1Y2Npb25fZ2FzLmNzdiIpDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJvZF9tZXJnZV9nYXMsIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9wcm9kdWNjaW9uX2dhcy54bHN4IikNCg0KI2RpZmVyZW5jaWEgcHJvbWVkaW8gZGVsIDE0JSBlbnRyZSBsYXMgYmFzZXMgKGVzIG1heW9yIGxhIGRlIG1lY29uKQ0KIyBzdW1tYXJ5KHByb2RfbWVyZ2VfZ2FzKQ0KDQpwcm9kX21lcmdlX2dhc19NTUJUVSA8LSBwcm9kX21lcmdlX2dhcyAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHZhcmlhYmxlLCB1bmlkYWQpICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7Y29udmVyc29yX20zTU1CVFVfcSh4KjEwMDApfSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIk1NQlRVIikgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpDQogIA0KcHJvZF9tZXJnZV9nYXNfYmVwIDwtIHByb2RfbWVyZ2VfZ2FzX01NQlRVICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdmFyaWFibGUsIHVuaWRhZCkgJT4lIA0KICBtdXRhdGVfYWxsKGNvbnZlcnNvcl9NTUJUVWJlcF9xKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiQkVQIikNCiAgDQojIHdyaXRlLmNzdihwcm9kX21lcmdlX2dhc19iZXAsIGZpbGUgPSAicmVzdWx0YWRvcy9wcm9kX21lcmdlX2dhc19iZXAuY3N2IikNCmBgYA0KDQo8YnI+DQoqKlRhYmxhIDIuIFByb2R1Y2Npw7NuIGRlIGdhcyBuYXR1cmFsIGVuIEFyZ2VudGluYSBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMgKE1NQlRVKSoqDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcHJvZF9tZXJnZV9nYXNfTU1CVFUgJT4lIA0KICBzZWxlY3QoLXByb2RfZ2FzKQ0KDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3RseShwcm9kX21lcmdlX2dhc19NTUJUVSAlPiUgDQogICAgICAgICAgIHNlbGVjdCgtcHJvZF9nYXMpICU+JQ0KICBtdXRhdGUocmVnYWxpYXMgPSBjYXNlX3doZW4ocmVnYWxpYXMgPT0gMCB+IE5BX3JlYWxfLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHJlZ2FsaWFzKSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gZnVlbnRlLCB2YWx1ZSA9IHZhbG9yLCA0Om5jb2woLikpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBmdWVudGUpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGxhYnModGl0bGUgPSAiR3LDoWZpY28gMi4gUHJvZHVjY2nDs24gZGUgZ2FzLg0KICAgICAgICBBcmdlbnRpbmEgKDE5MTMgLSAyMDIwKSIsDQogICAgICAgeSA9ICJNTUJUVSIsDQogICAgICAgY2FwdGlvbiA9ICJGdWVudGU6IGVsYWJvcmFjacOzbiBwcm9waWEgZW4gYmFzZSBhIEFudWFyaW8gZGUgQ29tYnVzdGlibGVzLCBFSUEsIE1pbmlzdGVyaW8gZGUgRWNvbm9tw61hLCBTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAoQmFzZSBSZWdhbMOtYXMgeSBTRVNDTykiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbih4KSBmb3JtYXQoeCwgYmlnLm1hcmsgPSAiLiIsIHNjaWVudGlmaWMgPSBGQUxTRSkpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiksIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KIyMjIFByb2R1Y2Npb24gdG90YWwNCmBgYHtyfQ0KcHJvZHVjY2lvbl90b3RhbCA8LSBwcm9kX21lcmdlX2dhc19iZXAgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLHByb2RfZ2FzKSAlPiUNCiAgbGVmdF9qb2luKHByb2RfbWVyZ2VfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLHByb2RfY3J1ZG8pICU+JSAgbXV0YXRlKHVuaWRhZCA9IkJFUCIpICkgJT4lIA0KICBtdXRhdGUocHJvZHVjY2lvbl90b3RhbF9iZXAgPSBwcm9kX2NydWRvICsgcHJvZF9nYXMpDQoNCnByb2R1Y2Npb25fdG90YWwNCmBgYA0KDQoNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyMgQ3J1ZG8gcHJvY2VzYWRvDQoNCmBgYA0KDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMjIFZlbnRhcw0KICMgQ3J1ZG8geSBHYXMNCg0KIyAqIFtTRVNDTyAtIFJlZmluYWNpw7NuIHkgQ29tZXJjaWFsaXphY2nDs24gZGUgcGV0csOzbGVvLCBnYXMgeSBkZXJpdmFkb3NdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9yZWZpbmFjaW9uLXktY29tZXJjaWFsaXphY2lvbi1kZS1wZXRyb2xlby1nYXMteS1kZXJpdmFkb3MtdGFibGFzLWRpbmFtaWNhcykNCiMgDQojICBEYXRvcyBkZSBjYW50aWRhZGVzDQojICANCiNjb21wcmFzIGVtcHJlc2FzIGRlbCBzZWN0b3INCmNvbXByYXMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vUmVmaW5hY2nDs24geSBjb21lcmNpYWxpemFjaW9uL2NvbXByYXMuY3N2IikNCg0KI3ZlbnRhcyBtZG8gaW50ZXJuby4gY2FudGlkYWRlcy4gcG9zdCAyMDEwDQp2ZW50YXNfbWVyY2Fkb19wcm9kdWN0b19lbXByZXNhIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1NFU0NPL1JlZmluYWNpw7NuIHkgY29tZXJjaWFsaXphY2lvbi92ZW50YXMtbWVyY2Fkby1wcm9kdWN0by1lbXByZXNhLmNzdiIsIA0KICAgIGxvY2FsZSA9IGxvY2FsZShlbmNvZGluZyA9ICJJU08tODg1OS0xIikpDQoNCiN2ZW50YXMgbWRvIGludGVybm8uIGNhbnRpZGFkZXMuIHBvc3QgMjAxMA0KdmVudGFzX2FfZW1wcmVzYXNfZGVsX3NlY3RvciA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9SZWZpbmFjacOzbiB5IGNvbWVyY2lhbGl6YWNpb24vdmVudGFzLWEtZW1wcmVzYXMtZGVsLXNlY3Rvci5jc3YiKQ0KDQpgYGANCg0KDQojIyBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vDQoNCkZ1ZW50ZXM6IA0KDQoqIFtCYXNlIE1pbmlzdGVyaW8gZGUgSGFjaWVuZGEsIEluZm9ybWVzDQpTZWN0b3JpYWxlc10oaHR0cHM6Ly93d3cuYXJnZW50aW5hLmdvYi5hci9lY29ub21pYS9wb2xpdGljYWVjb25vbWljYS9yZWdpb25hbHlzZWN0b3JpYWwvaW5mb3JtZXNwcm9kdWN0aXZvcykNCiogW1NlY3JldGFyw61hIGRlIEVuZXJnw61hLVJlZ2FsaWFzXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvcmVnYWxpYXMtZGUtcGV0cm9sZW8tY3J1ZG8tZ2FzLW5hdHVyYWwtZ2xwLWdhc29saW5hLXktY29uZGVuc2FkbykNCiAgKyBQb3IgYXVzZW5jaWEgZGUgaW5mb3JtYWNpw7NuLCBlbCBwcmVjaW8gZGUgcmVnYWxpYXMgZW50cmUgMTk5MyB5IDE5OTggZXMgZWwgcHJlY2lvIHRvdGFsIChlcyBkZWNpciwgZXMgdW4gcG9uZGVyYWRvIHF1ZSBpbmNsdXllIHRhbWJpw6luIGVsIHByZWNpbyBkZWwgbWVyY2FkbyBleHRlcm5vKS4gRW4gbG9zIGHDsW9zIHBvc3RlcmlvcmVzLCBkaWNobyBwcmVjaW8gc8OtIGNvcnJlc3BvbmRlIGFsIGRlbCBtZXJjYWRvIGludGVybm8uICANCiogS296dWxqIHkgUGlzdG9uZXNpLiBSZXZpc3RhICBkZWwgSW5zdGl0dXRvIGRlIEVjb25vbcOtYSBFbmVyZ8OpdGljYSAoSURFRSkgLSBGdW5kYWNpw7NuIEJhcmlsb2NoZSAgKDE5NzAgLSAxOTg4KS4gUHJlY2lvIG9maWNpYWwgaW50ZXJubyBkZSBsYSBjdWVuY2EgbmV1cXVpbmEgYSB0YXNhIGRlIGNhbWJpbyBvZmljaWFsLiBMYXMgZnVlbnRlcyB1dGlsaXphZGFzIGRlIGVzdGEgcmV2aXN0YSBzb24gU2VjcmV0YXJpYSBkZSBFbmVyZ8OtYSwgWVBGLCBHYXMgZGVsIEVzdGFkbywgQm9sZXRpbiBJbmZvcm1hdGl2byBkZSBUZWNoaW50IHkgc2VyaWVzIHByb3BpYXMgZGUgSURFRQ0KKiBNZW1vcmlhIEFudWFsIHkgYmFsYW5jZXMgY29udGFibGVzIGRlIFlQRiAodmFyaW9zIGHDsW9zKS4gUHJlY2lvIGludGVybyBwcm9tZWRpbyByZXN1bHRhbnRlIGRlIGxhIHJlbGFjacOzbiBlbnRyZSB2ZW50YXMgeSBjYW50aWRhZGVzIHByb2R1Y2lkYXMuDQoqIFByZWNpb3MgYW51YXJpby4gKipGQUxUQSBCVVNDQVIqKg0KDQoqKip2ZXIgZGUgZG9uZGUgc2FjYW4gZWwgVENDKioqDQoqKipjYW1iaWFyIHByZWNpbyBkZWwgOTIgcG9yIG1lY29uIGVzdGltYWRvIHkgdmFsb3JlcyByZXN0YW50ZXMgcG9yIGVzdGltYWRvIGRlIGlkZWUqKioNCg0KIyMjIyAgUHJlY2lvIE1lcmNhZG8gSW50ZXJubyBkZSBDcnVkbw0KDQoqIENyaXRlcmlvIHBhcmEgcHJlY2lvX2NydWRvOiANCiAgKyAxOTYzIGEgMTk2NTogS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFIGFqdXN0YWRvIGNvbiBlbCDDrW5kaWNlIGRlbCBwcmVjaW8gZGVsIEFudWFyaW8gZGUgWVBGIA0KICArIDE5ODkgYSAxOTkxOiBBbnVhcmlvIGRlIFlQRg0KICArIDE5NjYgYSAxOTg4OiBLb3p1bGogeSBQaXN0b25lc2kgLSBSZXZpc3RhIElERUUNCiAgKyAxOTkyOiBNRUNPTiBhanVzdGFkbyBjb24gbGEgdmFyaWFjacOzbiBkZWwgw41uZGljZSBkZSBwcmVjaW9zIGludGVybm9zIGFsIHBvciBtYXlvciAoSVBJTSkNCiAgKyAxOTkzIGVuIGFkZWxhbnRlOiBNRUNPTiANCiANCiAgDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI01lbW9yaWFzIGRlIFlQRg0KdnRhc19wcmVjaW9fbWVtb195cGZfY3J1ZG8gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZW1vcmlhIFlQRi92dGFzX3ZhbG9yX2NhbnRpZGFkX3ByZWNpb19jcnVkby54bHN4IikgJT4lIA0KICByZW5hbWUoY2FudF92ZW5kaWRhZCA9ICJtMyIsIHZhbG9yX3ZlbmRpZG8gPSAidmFsb3IiLCBwcmVjaW9fYSA9ICIkL20zIiwgDQogICAgICAgICB0Y2NfZGljID0gIkNvdGl6IGRpYyBVJFMiLCBwcmVjaW9fdXNkID0gIlUkUyAoYSBkaWNpZW1icmUgZGUgY2FkYSBhw7FvKSIpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9jYW50ID0gIm0zIiwNCiAgICAgICAgIHByZWNpb19taV9wZXNvc195cGZfY3J1ZG8gPSB2YWxvcl92ZW5kaWRvL2NhbnRfdmVuZGlkYWQsIA0KICAgICAgICAgcHJlY2lvX21pX3lwZl9jcnVkbyA9IHByZWNpb19taV9wZXNvc195cGZfY3J1ZG8gLyB0Y2NfZGljKSAlPiUgDQogICMgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSBzZWxlY3QoYW5pbywgdGNjKSkgJT4lDQogICMgbXV0YXRlKHByZWNpb19taV91c2RfeXBmX2NydWRvID0gcHJlY2lvX21pX3lwZl9jcnVkbyAvIHRjYykgJT4lICNyZWNhbGN1bG8gZGUgcHJlY2lvIGNvbiBudWV2byBUQw0KICBzZWxlY3QoYW5pbyx1bmlkYWRfY2FudCwgbW9uZWRhLCB2YWxvcl92ZW5kaWRvLCBjYW50X3ZlbmRpZGFkLCANCiAgICAgICAgIHByZWNpb19taV9wZXNvc195cGZfY3J1ZG8sdGNjX2RpYywgIHByZWNpb19taV95cGZfY3J1ZG8pDQoNCiMgQmFzZSBNRUNPTg0KcHJlY2lvX21pX21lY29uX2NydWRvIDwtIGhpZHJvY2FyYnVyb3NfYmFzZV9tZWNvbiAlPiUgDQogIGZpbHRlcihpbmRpY2Fkb3IgPT0gbGlzdGFfZmlsdHJvWzJdLCANCiAgICAgICAgIGFjdGl2aWRhZF9wcm9kdWN0b19ub21icmUgPT0gIlBldHLDs2xlbyBjcnVkbyIsDQogICAgICAgICBhbGNhbmNlX3RpcG8gPT0gIlBBSVMiKSAlPiUNCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKGZlY2hhKSkgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShwcmVjaW9fbWlfbWVjb25fY3J1ZG8gPSBtZWFuKHZhbG9yKSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9tMyIpDQoNCg0KI01FQ09OIC8gQ1VFTlRBUyBOQUNJT05BTEVTIA0KcHJlY2lvc19tZWNvbiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lY29uL2Jhc2UtbWluZXJpYS1lLWhpZHJvY2FyYnVyb3MgY3VlbnRhcyBuYWNpb25hbGVzLnhscyIsIA0KICAgIHNoZWV0ID0gIlByZWNpb3MiLCBza2lwID0gNykgJT4lIA0KICByZW5hbWUoYW5pbyA9ICIuLi4xIiwNCiAgICAgICAgIG1lcyA9ICIuLi4yIiwNCiAgICAgICAgIHByZWNpb19jb2JyZV9jX2xiID0gIkNvdGl6YWNpw7NuIEJvbHNhIGRlIExvbmRyZXMgKExNRSkiLA0KICAgICAgICAgcHJlY2lvX29yb191c2Rfb3p0ID0gICJDb3RpemFjacOzbiBCb2xzYSBkZSBOdWV2YSBZb3JrIChDT01FWCkiLA0KICAgICAgICAgcHJlY2lvX3BsYXRhX3VzZF9venQgPSAiQ290aXphY2nDs24gTG9uZG9uIEJ1bGxpb24gTWFya2V0IEFzc29jaWF0aW9uIChMQk1BKSIsDQogICAgICAgICBwcmVjaW9fY2luY19jX2xiID0gIkNvdGl6YWNpw7NuIExNRSIsDQogICAgICAgICBwcmVjaW9faGllcnJvX3VzZF90biA9ICI2Nyw1NSUgQnJhc2lsIiwNCiAgICAgICAgIHByZWNpb19wbG9tb191c2RfdG4gPSAiTG9uZG9uIE1ldGFsIEV4Y2hhbmdlIiwNCiAgICAgICAgIHByZWNpb19nYXNfbWVfcGVzb3NfTW0zID0gIm1lcmNhZG8gZXh0ZXJuby4uLjkiLA0KICAgICAgICAgcHJlY2lvX2dhc19taV9wZXNvc19NbTMgPSAibWVyY2FkbyBpbnRlcm5vLi4uMTAiLA0KICAgICAgICAgcHJlY2lvX2NydWRvX21lX3VzZF9tMyA9ICJtZXJjYWRvIGV4dGVybm8uLi4xMSIsDQogICAgICAgICBwcmVjaW9fY3J1ZG9fbWVfdXNkX2JibCAgPSAiLi4uMTIiLA0KICAgICAgICAgcHJlY2lvX2NydWRvX21pX3VzZF9tMyA9ICJtZXJjYWRvIGludGVybm8uLi4xMyIsDQogICAgICAgICBwcmVjaW9fY3J1ZG9fbWlfdXNkX2JibCAgPSAiLi4uMTQiLA0KICAgICAgICAgcHJvbWVkaW9fYnJlbnRfZHViYWlfd3RpX3VzZF9iYmwgPSAiUHJvbWVkaW8gQnJlbnQtRHViYWktV1RJIiwNCiAgICAgICAgIGJyZW50X3VrX3VzZF9iYmwgPSJCcmVudCAgUHVlcnRvcyBHcmFuIEJyZXRhw7FhIikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGFuaW8pKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHByZWNpb19nYXNfbWVfcGVzb3NfTW0zID0gbWVhbihwcmVjaW9fZ2FzX21lX3Blc29zX01tMywgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIHByZWNpb19nYXNfbWlfcGVzb3NfTW0zID0gbWVhbiggcHJlY2lvX2dhc19taV9wZXNvc19NbTMsIG5hLnJtID0gVCksDQogICAgICAgICAgICBwcmVjaW9fY3J1ZG9fbWVfdXNkX2JibCA9IG1lYW4oIHByZWNpb19jcnVkb19tZV91c2RfYmJsLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcHJlY2lvX2NydWRvX21pX3VzZF9iYmwgPSBtZWFuKCBwcmVjaW9fY3J1ZG9fbWlfdXNkX2JibCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIHByb21lZGlvX2JyZW50X2R1YmFpX3d0aV91c2RfYmJsID0gbWVhbiggcHJvbWVkaW9fYnJlbnRfZHViYWlfd3RpX3VzZF9iYmwsIG5hLnJtID0gVCksDQogICAgICAgICAgICBicmVudF91a191c2RfYmJsID0gbWVhbiggYnJlbnRfdWtfdXNkX2JibCwgbmEucm0gPSBUKSkgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsKSAlPiUgDQogIG11dGF0ZSggcHJlY2lvX2NydWRvX21lX3Blc29zX2JibCA9ICBwcmVjaW9fY3J1ZG9fbWVfdXNkX2JibCAqVENDLA0KICAgICAgICAgIHByZWNpb19jcnVkb19taV9wZXNvc19iYmwgPSAgcHJlY2lvX2NydWRvX21pX3VzZF9iYmwgKlRDQykNCg0KDQojIyBCYXNlIHJlZ2FsaWFzDQpwcmVjaW9fbWlfcmVnYWxpYXNfY3J1ZG8gPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZWdhbGlhcy9wcmVjaW9fbWVyY2Fkb19pbnRlcm5vX2NydWRvX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lDQogIHJlbmFtZShhbmlvID0gIkHDkU8iLA0KICAgICAgICAgbWVzID0gIk1FUyIsDQogICAgICAgICB0b3RhbF90aXBvX2NydWRvID0gIlRPVEFMIFRJUE8gREUgQ1JVRE8iKSAlPiUgDQogICAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvbTMiLA0KICAgICAgICAgYW5pbyA9IG5hLmxvY2YoYW5pbykpICU+JSAgDQogIHNlbGVjdChhbmlvLCBtZXMsIHVuaWRhZCwgdG90YWxfdGlwb19jcnVkbywgZXZlcnl0aGluZyguKSwgLWMoQlJFTlQsIFdUSSkpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSAidGlwb19jcnVkbyIsDQogICAgICAgICB2YWx1ZSA9ICJ2YWxvciIsDQogICAgICAgICA1Om5jb2woLikpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUNCiAgc3VtbWFyaXNlKHByZWNpb19taV9yZWdhbGlhc19jcnVkbyA9IG1lYW4odG90YWxfdGlwb19jcnVkbyksDQogICAgICAgICAgICBwcmVjaW9fcHJvbWVkaW9fdGlwb19jcnVkbyA9IG1lYW4odmFsb3IpKSAlPiUgDQogIG11dGF0ZSh0aXBvX3ByZWNpbyA9ICJtZXJjYWRvIGludGVybm8iKQ0KDQojIFJldmlzdGEgSURFRQ0KIyBwcmVjaW9zIGludGVybm9zIHZzIHByZWNpbyBwcm9tZWRpbyBpbnRlcm5vIGRlIGVldXUgdnMgcHJlY2lvIGFyYWJhaSBzYXVkaXRhLiBjdWFkcm8gMy4xLjMuMSBwLjE3MA0KcHJlY2lvX21pX3ZzX2ludGVybmFjaW9uYWxfaWRlZV9jcnVkbyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgcGV0cm9sZW8gY3J1ZG8geSBkZXJpdmFkb3MgMTk3MCAtIDE5ODkueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDQpDQoNCg0KI21lcmdlDQpwcmVjaW9fbWlfY3J1ZG8gPC0gcHJlY2lvX21pX3JlZ2FsaWFzX2NydWRvICU+JSAgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19taV9yZWdhbGlhc19jcnVkbykgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX21lY29uX2NydWRvICkgJT4lIA0KICBmdWxsX2pvaW4odnRhc19wcmVjaW9fbWVtb195cGZfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgICBwcmVjaW9fbWlfeXBmX2NydWRvICkpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19taV92c19pbnRlcm5hY2lvbmFsX2lkZWVfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX21pX2lkZWVfY3J1ZG8gPSBwcmVjaW9fY3J1ZG9fbmV1cXVpbmFfdGNfb2ZpY2lhbCApKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL20zIikgJT4lIA0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcmVjaW9fbWlfcmVnYWxpYXNfY3J1ZG8iLCANCiAgICAgICAgICAgICAgICAgICAgICAicHJlY2lvX21pX21lY29uX2NydWRvIiwgInByZWNpb19taV95cGZfY3J1ZG8iLCAicHJlY2lvX21pX2lkZWVfY3J1ZG8iKSwgDQogICAgICAgICAgICAuZnVucyA9IGNvbnZlcnNvcl9tM2JibF9wKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19taV9tZWNvbl9jY25uX2NydWRvID0gcHJlY2lvX2NydWRvX21pX3VzZF9iYmwgKSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBpbV9iYXNlOTQgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgaXBpbV9uaXZlbF9ncmFsXzk0KSwgYnkgPSAiYW5pbyIpICU+JSANCiAgcmVuYW1lKHJlZ2FsaWFzID0gcHJlY2lvX21pX3JlZ2FsaWFzX2NydWRvLA0KICAgICAgICAgbWVjb24gPSBwcmVjaW9fbWlfbWVjb25fY3J1ZG8sDQogICAgICAgICB5cGYgPSBwcmVjaW9fbWlfeXBmX2NydWRvLA0KICAgICAgICAgaWRlZSA9IHByZWNpb19taV9pZGVlX2NydWRvLA0KICAgICAgICAgbWVjb25fY2NubiA9IHByZWNpb19taV9tZWNvbl9jY25uX2NydWRvKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICB1bmdyb3VwKCkNCnByZWNpb19taV9jcnVkbyA8LSAgcHJlY2lvX21pX2NydWRvICU+JSANCiAgbXV0YXRlKCB1bmlkYWQgPSAiVVNEL2JhcnJpbGVzIiwNCiAgICAgICAgICAgdmFyaWFibGUgPSAgIlByZWNpbyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBwZXRyw7NsZW8gY3J1ZG8gc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIiwNCiAgICAgICAgICBtZWNvbl9lc3RpbWFkbyA9IHByZWNpb19taV9jcnVkbyRtZWNvbltwcmVjaW9fbWlfY3J1ZG8kYW5pbz09MTk5NF0qaXBpbV9uaXZlbF9ncmFsXzk0LA0KICAgICAgICAgIGluZGljZV95cGZfNzIgPSBnZW5lcmFyX2luZGljZShzZXJpZSA9IHlwZiwgZmVjaGEgPSBhbmlvLCBmZWNoYV9iYXNlID0gMTk3MiksDQogICAgICAgICBpZGVlX2VzdGltYWRvID0gcHJlY2lvX21pX2NydWRvJGlkZWVbcHJlY2lvX21pX2NydWRvJGFuaW89PTE5NzJdICogaW5kaWNlX3lwZl83MiwNCiAgICAgICAgIHByZWNpb19jcnVkb19tZG9pbnQgPSAgIGNhc2Vfd2hlbigNCiAgICAgICAgICAgICAgICBhbmlvICVpbiUgMTk2MzoxOTY1IH4gaWRlZV9lc3RpbWFkbywNCiAgICAgICAgICAgICAgICBhbmlvICVpbiUgMTk2NjoxOTg4IH4gaWRlZSwNCiAgICAgICAgICAgICAgICBhbmlvICVpbiUgMTk4OToxOTkxIH4geXBmLA0KICAgICAgICAgICAgICAgIGFuaW8gPT0gMTk5MiB+IG1lY29uX2VzdGltYWRvLA0KICAgICAgICAgICAgICAgIGFuaW8gPjE5OTIgfiBtZWNvbikpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgdmFyaWFibGUsIHByZWNpb19jcnVkb19tZG9pbnQgLCBldmVyeXRoaW5nKC4pLCANCiAgICAgICAgIC1jKGlwaW1fbml2ZWxfZ3JhbF85NCwgaWRlZV9lc3RpbWFkbyxtZWNvbl9lc3RpbWFkbyxpbmRpY2VfeXBmXzcyLGlkZWVfZXN0aW1hZG8gKSkgJT4lIA0KICBmaWx0ZXIoYW5pbyA8IDIwMjEpDQoNCiAgDQogIA0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb19taV9jcnVkbywgcGF0aCA9ICJyZXN1bHRhZG9zL3ByZWNpb19taV9jcnVkby54bHN4IikNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb19taV92c19pbnRlcm5hY2lvbmFsX2lkZWVfY3J1ZG8gJT4lIA0KIyAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBwcmVjaW9fY3J1ZG9fbmV1cXVpbmFfdGNfb2ZpY2lhbCApICU+JSANCiMgICAgICAgICAgICAgICAgICAgICAgIHNwcmVhZCguLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGFuaW8sDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwcmVjaW9fY3J1ZG9fbmV1cXVpbmFfdGNfb2ZpY2lhbCkgJT4lIA0KIyAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHZhcmlhYmxlID0gInByZWNpb19jcnVkb19uZXVxdWluYV90Y19vZmljaWFsIGVuIFVTRC9tMyIpICU+JQ0KIyAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHZhcmlhYmxlLCBldmVyeXRoaW5nKC4pKSwNCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInByZWNpb19taV92c19pbnRlcm5hY2lvbmFsX2lkZWVfY3J1ZG8ueGxzeCIpDQpgYGANCg0KPGJyPg0KKipUYWJsYSAzLiBQcmVjaW8gZGVsIG1lcmNhZG8gaW50ZXJubyBkZWwgcGV0csOzbGVvIGNydWRvIGVuIEFyZ2VudGluYSBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMgKGJhcnJpbGVzKSoqDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcHJlY2lvX21pX2NydWRvICU+JSANCiAgc2VsZWN0KC1wcmVjaW9fY3J1ZG9fbWRvaW50KQ0KYGBgDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90bHkocHJlY2lvX21pX2NydWRvICU+JSANCiAgICAgIHNlbGVjdCgtcHJlY2lvX2NydWRvX21kb2ludCkgJT4lIA0KICAgICAgbXV0YXRlKHJlZ2FsaWFzID0gDQogICAgICAgICAgICAgICBjYXNlX3doZW4ocmVnYWxpYXMgPT0gMCB+IE5BX3JlYWxfLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcmVnYWxpYXMpKSAlPiUgDQogIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwgdmFsdWUgPSB2YWxvciwgNDpuY29sKC4pKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdmFyaWFibGUsIHNoYXBlID0gdmFyaWFibGUpKSsNCiAgZ2VvbV9saW5lKGFscGhhID0gMC44KSsNCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyAzLiBQcmVjaW9zIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIHBldHLDs2xlbyBjcnVkby4NCiAgICAgICBBcmdlbnRpbmEgKDE5NjMgLSAyMDIwKSIsDQogICAgICAgeSA9ICJVU0QvYmFycmlsIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCiAgICAgICAgICAgICAgICAgICAgIA0KYGBgDQoNCg0KIyMjIyBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vIGRlIEdhcyBOYXR1cmFsDQoqIFByZWNpbyBNZXJjYWRvIEludGVybm8gZGUgZ2FzOg0KICArIDE5NjMgLSAxOTY5ICYgMTk4OSAtIDE5OTI6IEFudWFyaW8gZGUgWVBGDQogICsgMTk3MCAtIDE5ODg6ICBLb3p1bGogeSBQaXN0b25lc2kgLSBSZXZpc3RhIElERUUNCiAgKyAxOTkzIGVuIGFkZWxhbnRlOiBTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAtIEJhc2UgUmVnYWzDrWFzDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNBbnVhcmlvIFlQRg0KdnRhc19wcmVjaW9fbWVtb195cGZfZ2FzIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVtb3JpYSBZUEYvdnRhc192YWxvcl9jYW50aWRhZF9wcmVjaW9fZ2FzLnhsc3giKSAlPiUgDQogICAgcmVuYW1lKGNhbnRfdmVuZGlkYWQgPSAibTMiLCB2YWxvcl92ZW5kaWRvID0gIiQiLCBtb25lZGEgPSAiTW9uZWRhIikgJT4lIA0KICBsZWZ0X2pvaW4odnRhc19wcmVjaW9fbWVtb195cGZfY3J1ZG8gJT4lIHNlbGVjdChhbmlvLCBtb25lZGEsIHRjY19kaWMgKSkgJT4lIA0KICBtdXRhdGUocHJlY2lvX21pX3lwZl9nYXNfbW9uZWRhX29yaWdpbmFsID0gKHZhbG9yX3ZlbmRpZG8vY2FudF92ZW5kaWRhZCkgLyAxMDAwLA0KICAgICAgICAgcHJlY2lvX21pX3VzZF95cGZfZ2FzID0gcHJlY2lvX21pX3lwZl9nYXNfbW9uZWRhX29yaWdpbmFsIC8gdGNjX2RpYywNCiAgICAgICAgIHByZWNpb19taV95cGZfZ2FzID0gY2FzZV93aGVuKCAjaG9tb2dlbml6YW1vcyBsb3MgY2FtYmlvcyBkZSBtb25lZGENCiAgICAgICAgICAgbW9uZWRhID09ICJtJG4iIH4gcHJlY2lvX21pX3lwZl9nYXNfbW9uZWRhX29yaWdpbmFsL2NvbnZlcnNvcl9wZXNvcyRgbSRuYCAsDQogICAgICAgICAgIG1vbmVkYSA9PSAiJGxleSIgfiBwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwvY29udmVyc29yX3Blc29zJGAkTGV5YCwgDQogICAgICAgICAgIG1vbmVkYSA9PSAiJGFyZyIgfiBwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwvY29udmVyc29yX3Blc29zJGAkYWAsIA0KICAgICAgICAgICBtb25lZGEgPT0gIkEiIH4gcHJlY2lvX21pX3lwZl9nYXNfbW9uZWRhX29yaWdpbmFsL2NvbnZlcnNvcl9wZXNvcyRBLA0KICAgICAgICAgICBUIH4gcHJlY2lvX21pX3lwZl9nYXNfbW9uZWRhX29yaWdpbmFsKSwNCiAgICAgICAgIG1vbmVkYSA9ICJhcnMiLA0KICAgICAgICAgdW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIpICU+JSAjYWNsYXJhbW9zIGxhIHVuaWRhZCBtb25ldGFyaWEgeWEgdHJhbnNmb3JtYWRhDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIG1vbmVkYSwgdmFsb3JfdmVuZGlkbywgY2FudF92ZW5kaWRhZCwgDQogICAgICAgICBwcmVjaW9fbWlfeXBmX2dhcyxwcmVjaW9fbWlfeXBmX2dhc19tb25lZGFfb3JpZ2luYWwsIHRjY19kaWMsIHByZWNpb19taV91c2RfeXBmX2dhcykNCg0KI0FudWFyaW8gQ29tYnVzdGlibGUNCmFudWFyaW9fZGVfY29tYnVzdGlibGUgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9BbnVhcmlvIENvbWJ1c3RpYmxlcy9hbnVhcmlvIGRlIGNvbWJ1c3RpYmxlLnhsc3giKSAlPiUgDQogIGZpbHRlcihtZXJjYW5jaWEgPT0gImdhc19uYXR1cmFsIikgJT4lIA0KICBncm91cF9ieShhbmlvICwgICAgIG1lcywgICAgICB1bmlkYWQgKSAlPiUgDQogIHN1bW1hcmlzZShwcmVjaW9fbWlfYW51YXJpb19nYXMgPSBtZWFuKHZhbG9yKSkgJT4lIA0KICBncm91cF9ieShhbmlvICwgICAgICAgdW5pZGFkICkgJT4lIA0KICBzdW1tYXJpc2UocHJlY2lvX21pX2FudWFyaW9fZ2FzID0gbWVhbihwcmVjaW9fbWlfYW51YXJpb19nYXMpKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fbWlfYW51YXJpb19nYXMgPSAocHJlY2lvX21pX2FudWFyaW9fZ2FzL2NvbnZlcnNvcl9wZXNvcyRBKS8xMDAwLA0KICAgICAgICAgdW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIpDQoNCiMgQmFzZSBNRUNPTg0KcHJlY2lvc19pbnRlcm5vc19tZWNvbl9nYXMgPC0gaGlkcm9jYXJidXJvc19iYXNlX21lY29uICU+JSANCiAgZmlsdGVyKGluZGljYWRvciA9PSBsaXN0YV9maWx0cm9bMl0sIA0KICAgICAgICAgYWN0aXZpZGFkX3Byb2R1Y3RvX25vbWJyZSA9PSAiR2FzIG5hdHVyYWwiLA0KICAgICAgICAgYWxjYW5jZV90aXBvID09ICJQQUlTIikgJT4lDQogIG11dGF0ZShhbmlvID0geWVhcihmZWNoYSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UocHJlY2lvX21pX21lY29uX2dhcyA9IG1lYW4odmFsb3IpKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikNCg0KDQojIyBCYXNlIHJlZ2FsaWFzDQojdmFsb3JlcyA5MyAtIDk4DQpwcmVjaW9fcmVnYWxpYXNfdG90YWxfZ2FzIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUHJlY2lvcy9wcmVjaW9fbWlfZ2FzLnhsc3giLA0KICAgIHNoZWV0ID0gImprIikgJT4lIA0KICBmaWx0ZXIoYW5pbyA8IDE5OTkpICU+JSANCiAgbXV0YXRlKHByZWNpb190b3RhbF9nYXMgPSBwcmVjaW9fbWlfZ2FzICogMTAwMCwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKSAlPiUgDQogIHNlbGVjdCgtcHJlY2lvX21pX2dhcykNCg0KI3ZhbG9yZXMgcG9zdCA5OQ0KcHJlY2lvX3JlZ2FsaWFzX21pX2dhcyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JlZ2FsaWFzL3ByZWNpb19tZXJjYWRvX2ludGVybm9fZ2FzX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lDQogIHJlbmFtZShhbmlvID0gIkHDkU8iLA0KICAgICAgICAgbWVzID0gIk1FUyIsDQogICAgICAgICB0b3RhbF9jdWVuY2EgPSAiVE9UQUwgQ1VFTkNBIikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIsDQogICAgICAgICBhbmlvID0gbmEubG9jZihhbmlvKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgbWVzLCB1bmlkYWQsICBldmVyeXRoaW5nKC4pKSAlPiUgDQogIGdhdGhlciguLA0KICAgICAgICAga2V5ID0gImN1ZW5jYSIsDQogICAgICAgICB2YWx1ZSA9ICJ2YWxvciIsDQogICAgICAgICA0Om5jb2woLikpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gZ3N1YigiLCIsICIiLCB2YWxvciksDQogICAgICAgICB2YWxvciA9IGFzLmRvdWJsZSh2YWxvcikpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkLCBjdWVuY2EpICU+JSANCiAgc3VtbWFyaXNlKHByZWNpb19wcm9tZWRpb19jdWVuY2EgPSBtZWFuKHZhbG9yKSklPiUgDQogIG11dGF0ZSh0aXBvX3ByZWNpbyA9ICJtZXJjYWRvIGludGVybm8iKSAlPiUgDQogIGZpbHRlcihjdWVuY2EgPT0gInRvdGFsX2N1ZW5jYSIpJT4lICAjcXVpdG8gcHJlY2lvIHByb21lZGlvIGVsYWJvcmFkbyBwcSBubyBzZSB1c2Fyw6ENCiAgbGVmdF9qb2luKHByZWNpb19yZWdhbGlhc190b3RhbF9nYXMpICU+JSANCiAgbXV0YXRlKHByZWNpb19taV9yZWdhbGlhc19nYXMgPSBjYXNlX3doZW4oYW5pbyA8IDE5OTkgfiBwcmVjaW9fdG90YWxfZ2FzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcHJlY2lvX3Byb21lZGlvX2N1ZW5jYSkpICU+JSANCiAgc2VsZWN0KC1jKHByZWNpb190b3RhbF9nYXMsIHByZWNpb19wcm9tZWRpb19jdWVuY2EpKQ0KDQojUmV2aXN0YSBJREVFDQojcHJlY2lvIHRyYW5zZmVyZW5jaWEsIHJlZ2FsaWFzLCBjb21wZW5zYWNpb25lcywgZXRjIHByb21lZGlvIGFudWFsDQpwcmVjaW9fbWlfaWRlZV9nYXMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIGdhcyBuYXR1cmFsIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg4Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSAyKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb190cmFuc2ZlcmVuY2lhKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfNzApKSAlPiUNCiAgbXV0YXRlKHByZWNpb19taV9pbmRleGFkb19wZXNvcyA9IHByZWNpb190cmFuc2ZlcmVuY2lhICogaXBjXzcwIC8gY29udmVyc29yX3Blc29zJGAkTGV5YCkgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdChhbmlvLCB0Y2MpICkgJT4lIA0KICBtdXRhdGUocHJlY2lvX21pX2luZGV4YWRvX3VzZCA9IHByZWNpb19taV9pbmRleGFkb19wZXNvcy90Y2MgKSAgDQogICMgc2VsZWN0KC1jKHVuaWRhZCwgcHJlY2lvX3RyYW5zZmVyZW5jaWEpKQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX21pX2lkZWVfZ2FzLCBwYXRoID0gInByZWNpb19taV9pZGVlX2dhcy54bHN4IikNCg0KI2NvbnZlcnNvciBkZSBtb25lZGEgDQojICU+JSANCiMgICBtdXRhdGUocHJlY2lvX3RyYW5zZmVyZW5jaWEgPSBjYXNlX3doZW4oDQojICAgICBhbmlvIDwgMTk4MyB+IHByZWNpb190cmFuc2ZlcmVuY2lhL2NvbnZlcnNvcl9wZXNvcyRgJExleWAsDQojICAgICBhbmlvID09IDE5ODMgfiBwcmVjaW9fdHJhbnNmZXJlbmNpYSAvIGNvbnZlcnNvcl9wZXNvcyRgJGFgLA0KIyAgICAgYW5pbyAlaW4lIDE5ODM6MTk5MSB+IHByZWNpb190cmFuc2ZlcmVuY2lhL2NvbnZlcnNvcl9wZXNvcyRBKSkNCg0KI01lcmdlDQpwcmVjaW9fbWlfZ2FzIDwtIHByZWNpb19yZWdhbGlhc19taV9nYXMgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fbWlfcmVnYWxpYXNfZ2FzKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX2ludGVybm9zX21lY29uX2dhcykgJT4lIA0KICBmdWxsX2pvaW4odnRhc19wcmVjaW9fbWVtb195cGZfZ2FzICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgIHByZWNpb19taV95cGZfZ2FzICkpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19taV9pZGVlX2dhcyAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBwcmVjaW9fbWlfaWRlZV9pbmRleGFkbyA9IHByZWNpb19taV9pbmRleGFkb19wZXNvcykpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByZWNpb19taV9pZGVlX2N0ZXNfcGVzb3MgPSBwcmVjaW9fdHJhbnNmZXJlbmNpYSkpICU+JSANCiAgbGVmdF9qb2luKGFudWFyaW9fZGVfY29tYnVzdGlibGUpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbyAsIHByZWNpb19taV9tZWNvbl9jY25uX2dhcyA9IHByZWNpb19nYXNfbWlfcGVzb3NfTW0zKSkgJT4lIA0KICAjIG11dGF0ZShwcmVjaW9fZ2FzX21kb2ludCA9IGNhc2Vfd2hlbihhbmlvIDwgMTk4OCB+IHByZWNpb19taV95cGZfZ2FzLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPT0gMTk4OCB+ICBwcmVjaW9fbWlfaWRlZV9pbmRleGFkbywNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvICVpbiUgMTk4OToxOTkxICB+IHByZWNpb19taV95cGZfZ2FzLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPT0gMTk5MiAgfiBwcmVjaW9fbWlfeXBmX2dhcy8xMCwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID4gMTk5MiB+IHByZWNpb19taV9yZWdhbGlhc19nYXMpLA0KICAjICAgICAgICBkaWZfeXBmX2lkZWUgPSBwcmVjaW9fbWlfeXBmX2dhcy9wcmVjaW9fbWlfaWRlZV9pbmRleGFkby0xICkgJT4lDQogIG11dGF0ZSh2YXJpYWJsZSA9ICJQcmVjaW8gZGVsIG1lcmNhZG8gaW50ZXJubyBkZWwgZ2FzIG5hdHVyYWwgc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIiwNCiAgICAgICAgIHByZWNpb19nYXNfbWRvaW50ID0gY2FzZV93aGVuKGFuaW8gJWluJSAxOTYzOjE5Njl8YW5pbyAlaW4lIDE5ODk6MTk5MSB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX21pX3lwZl9nYXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvICVpbiUgMTk3MDoxOTg4IH4gcHJlY2lvX21pX2lkZWVfaW5kZXhhZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPT0gMTk5MiAgfiBwcmVjaW9fbWlfeXBmX2dhcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDE5OTIgfiBwcmVjaW9fbWlfcmVnYWxpYXNfZ2FzKSApICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCx2YXJpYWJsZSwgcHJlY2lvX2dhc19tZG9pbnQsIGV2ZXJ5dGhpbmcoLikgKSAlPiUgDQogIHJlbmFtZShyZWdhbGlhcyA9IHByZWNpb19taV9yZWdhbGlhc19nYXMsDQogICAgICAgICBtZWNvbiA9IHByZWNpb19taV9tZWNvbl9nYXMsDQogICAgICAgICB5cGYgPSBwcmVjaW9fbWlfeXBmX2dhcywNCiAgICAgICAgIGlkZWUgPSBwcmVjaW9fbWlfaWRlZV9pbmRleGFkbywNCiAgICAgICAgIG1lY29uX2Njbm4gPSBwcmVjaW9fbWlfbWVjb25fY2Nubl9nYXMsDQogICAgICAgICBhbnVhcmlvID0gcHJlY2lvX21pX2FudWFyaW9fZ2FzKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KI3ByZWNpbyBpbnRlcm5vIGVuIE1NQlRVIHBlc29zDQpwcmVjaW9fbWlfZ2FzX01NQlRVIDwtICBwcmVjaW9fbWlfZ2FzICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzZWxlY3QoLWModW5pZGFkLCB2YXJpYWJsZSkpICU+JSANCiAgbXV0YXRlX2FsbCggZnVuY3Rpb24oeCkge2NvbnZlcnNvcl9tM01NQlRVX3AoeC8xMDAwKX0pICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJhcnMvTU1CVFUiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpDQoNCiNwcmVjaW8gaW50ZXJubyBlbiBNTUJUVSB1c2QNCnByZWNpb19pbnRlcm5vX2dhc19tbWJ0dV91c2QgPC0gcHJlY2lvX21pX2dhc19NTUJUVSAlPiUNCiAgIyBzZWxlY3QoLWRpZl95cGZfaWRlZSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19wcmVjaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMzpuY29sKC4pKSAlPiUNCiBsZWZ0X2pvaW4odGNwX2FudWFsX2IsIGJ5ID0gImFuaW8iKSAlPiUNCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IvIHRjYywNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvTU1CVFUiKSAlPiUgDQogIHNlbGVjdCgtYyh0Y2MsdGNwLCBzb2JyZXZhbHVhY2lvbikpICU+JSANCiAgc3ByZWFkKGtleSA9IHRpcG9fcHJlY2lvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvcikNCg0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX21pX2dhcywgcGF0aCA9ICJyZXN1bHRhZG9zL3ByZWNpb19taV9nYXMueGxzeCIpDQoNCiNwcmVjaW8gcmV2aXN0YSB0cmFuc3B1ZXN0bw0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb19taV9pZGVlX2dhcyAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHByZWNpb190cmFuc2ZlcmVuY2lhX3lwZl9hX0dFID1wcmVjaW9fdHJhbnNmZXJlbmNpYSApICU+JSANCiMgICAgICAgICAgICAgICAgICAgICAgIHNwcmVhZCguLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGFuaW8sDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwcmVjaW9fdHJhbnNmZXJlbmNpYV95cGZfYV9HRSkgJT4lIA0KIyAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHZhcmlhYmxlID0gInByZWNpb190cmFuc2ZlcmVuY2lhX3lwZl9hX0dFIGVuIHBlc29zIGRlIDE5NzAvMTAwMCBtMyIpICU+JQ0KIyAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHZhcmlhYmxlLCBldmVyeXRoaW5nKC4pKSwNCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInByZWNpb19taV9pZGVlX2dhcy54bHN4IikNCg0KIyBncmFmX21pX2dhcyA8LSBwcmVjaW9fbWlfaWRlZV9nYXMgJT4lIA0KIyAgIHNlbGVjdChhbmlvLCBwcmVjaW9fbWlfaW5kZXhhZG9fcGVzb3MsIHByZWNpb19taV9pbmRleGFkb191c2QpICU+JSANCiMgICBnYXRoZXIoLiwNCiMgICAgICAgICAga2V5ID0gdmFyaWFibGUgLA0KIyAgICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KIyAgICAgICAgICAyOjMpICU+JQ0KIyAgIGZpbHRlcih2YXJpYWJsZSA9PSJwcmVjaW9fbWlfaW5kZXhhZG9fdXNkIiApICU+JSANCiMgICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHZhcmlhYmxlKSkrDQojICAgZ2VvbV9saW5lKCkNCiMgZ3JhZl9taV9nYXMNCg0KIyBwcmVjaW9fbWlfZ2FzICU+JSANCiMgICBmaWx0ZXIoYW5pbyA+IDIwMDApICU+JSANCiMgICBzZWxlY3QoYW5pbywgcHJlY2lvX2dhc19tZG9pbnQsIHByZWNpb19taV9tZWNvbl9jY25uX2dhcykNCmBgYA0KDQo8YnI+DQoqKlRhYmxhIDQuIFByZWNpbyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBnYXMgbmF0dXJhbCBlbiBBcmdlbnRpbmEgc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIChiYXJyaWxlcykqKg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnByZWNpb19taV9nYXMgJT4lIA0KICBzZWxlY3QoLXByZWNpb19nYXNfbWRvaW50KQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfcHJlY2lvX2ludGVybm9fZ2FzX21tYnR1IDwtIHByZWNpb19taV9nYXNfTU1CVFUgJT4lDQogICMgc2VsZWN0KC1jKGRpZl95cGZfaWRlZSwgcHJlY2lvX2dhc19tZG9pbnQpKSAlPiUgDQogIHNlbGVjdCgtYyggcHJlY2lvX2dhc19tZG9pbnQpKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOm5jb2woLikpICU+JQ0KIGxlZnRfam9pbih0Y3BfYW51YWxfYiwgYnkgPSAiYW5pbyIpICU+JQ0KICBtdXRhdGUodmFsb3IgPSB2YWxvci8gdGNjKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gYW5pbywgeSA9IHZhbG9yLCBjb2xvciA9IHRpcG9fcHJlY2lvKSkrDQogIGdlb21fbGluZSgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICAjIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIGxhYnModGl0bGUgPSAiR3LDoWZpY28gTsKwNC4gUHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIGdhcyBuYXR1cmFsLg0KICAgICAgIEFyZ2VudGluYSAoMTk2MyAtIDIwMTgpIiwgDQogICAgICAgeSA9ICJVU0QvTU1CVFUiKQ0KZ2dwbG90bHkoZ3JhZl9wcmVjaW9faW50ZXJub19nYXNfbW1idHUsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQpgYGANCg0KDQojIyBQcmVjaW9zIGRlIFJlZmVyZW5jaWEgZGVsIE1lcmNhZG8gTXVuZGlhbA0KUHJlY2lvcyBkZSBleHBvcnRhY2nDs24gZGVzZGUgQXJnZW50aW5hLCBiZW5jaG1hcmtzIHkgUHJlY2lvcyBkZWwgbWVyY2FkbyBkZSBFRVVVIChzb2xvIGdhcywgaW50ZXJub3MgeSBkZSBleHBvL2ltcG8pDQoNCiogW1NlY3JldGFyw61hIGRlIEVuZXJnw61hLVJlZ2FsaWFzXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvcmVnYWxpYXMtZGUtcGV0cm9sZW8tY3J1ZG8tZ2FzLW5hdHVyYWwtZ2xwLWdhc29saW5hLXktY29uZGVuc2FkbykpICgyMDA2LWhveSkNCiogW01FQ09OXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvcHJlY2lvLWRlLWV4cG9ydGFjaW9uLWRlLXBldHJvbGVvLWNydWRvKS4gU2VyaWUgY29ydGEgeSBzaW4gdHJhbnNmb3JtYWNpb25lcw0KKiBFSUENCiAgKyBbQnJlbnRdKGh0dHBzOi8vd3d3LmVpYS5nb3YvZG5hdi9wZXQvaGlzdC9SQlJURUQuaHRtKSAoMTk4Ny1ob3kpDQogICsgW1dUSV0oaHR0cHM6Ly93d3cuZWlhLmdvdi9kbmF2L3BldC9oaXN0L3J3dGNELmh0bSkgKDE5ODYtaG95KQ0KICArIFtIZW5yeSBIdWJdKGh0dHBzOi8vd3d3LmVpYS5nb3YvZG5hdi9uZy9oaXN0L3JuZ3doaGRkLmh0bSkgKDE5OTctaG95KQ0KICArIFtQcmVjaW8gR2FzIGRlIEJvY2EgZGUgUG96byBlbiBFRVVVXShodHRwczovL3d3dy5laWEuZ292L2RuYXYvbmcvaGlzdC9uOTE5MHVzM0EuaHRtKQ0KKiBbSW5mbGF0aW9uIERhdGFdKGh0dHBzOi8vaW5mbGF0aW9uZGF0YS5jb20vYXJ0aWNsZXMvaW5mbGF0aW9uLWFkanVzdGVkLXByaWNlcy9oaXN0b3JpY2FsLWNydWRlLW9pbC1wcmljZXMtdGFibGUvKSAoMTk0Ni1ob3kpDQoqIFtFdXJvc3RhdF0oaHR0cHM6Ly9lYy5ldXJvcGEuZXUvZXVyb3N0YXQvd2ViL2VuZXJneS9kYXRhL2RhdGFiYXNlKQ0KKiBSZXZpc3RhIElERUUgICANCiAgKyBQcmVjaW8gZGUgSW1wb3J0YWNpw7NuIGRlIGdhcyBuYXR1cmFsIGRlc2RlIEJvbGl2aWEgKDE5NzAtMTk4OCkNCiogW1VOIENvbXRyYWRlXShodHRwczovL2NvbXRyYWRlLnVuLm9yZy9kYXRhLykNCiAgKyBQcmVjaW8gZGUgRXhwb3J0YWNpw7NuIGUgSW1wb3J0YWNpw7NuIGRlIGdhcyB5IGNydWRvIChhIEJvbGl2aWEgeSBwcm9tZWRpbyBtdW5kaWFsKQ0KICArIEVsIHByZWNpbyBpbXBvIGJvbGl2aWEgZGUgIFVOIENvbXRyYWRlIGNpZXJyYSwgZGEgdmFsb3JlcyBjb2hlcmVudGVzIHBlcm8gbm8gZGViZXJpYSwgZGFkbyBxdWUgbGEgY29udmVyc2nDs24gZGViZXJpYSByZWFsaXphcnNlIG11bHRpcGxpY2FuZG8gZWwgcHJlY2lvIGVuIE1tMyBwb3IgMTAwMCB5IGFow60gcmVjacOpbiByZWFsaXphciBsYSBjb252ZXJzacOzbg0KICANCg0KIyMjIyBQcmVjaW9zIGRlIFJlZmVyZW5jaWEgZGVsIENydWRvDQoqIEZ1ZW50ZXMgc2VsZWNjaW9uYWRhcyBwYXJhIHByZWNpb19tZV9jcnVkbzogDQogICsgZW50cmUgMTk2MiB5IDE5OTI6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gYXJnZW50aW5hIGRlIFVOIENvbXRyYWRlIChjbGFzaWZpY2FjacOzbiBTSVRDIGFzIHJlcG9ydGVkKQ0KICArIGVudHJlIDE5OTMtMjAwMSB5IDIwMDQtMjAxNDogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgTWVjb24NCiAgKyBlbnRyZSAyMDAyIHkgMjAwMzogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBkZSBBcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUgKENsYXNpZmljYWNpw7NuIEhTIGFzIHJlcG9ydGVkKQ0KICArIDIwMTQgZW4gYWRlbGFudGU6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gYXJnZW50aW5hIGRlIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIChSZWdhbMOtYXMpDQogICsgVmFsb3JlcyBmYWx0YW50ZXMgcHJldmlvcyBhIDE5OTIgKDE5NzAgLSAxOTg1KTogQnJlbnQgKEZ1ZW50ZTogSW5mbGF0aW9uIERhdGEpDQoNCg0KKipGYWx0YSBjb25zdHJ1aXIgdW5hIHBhcmlkYWQgZGUgZXhwby9pbXBvIGNvbiBlbCBmbGV0ZSoqDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojQmFzZSByZWdhbGlhcw0KcHJlY2lvX21lX3JlZ2FsaWFzX2NydWRvIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmVnYWxpYXMvcHJlY2lvX21lcmNhZG9fZXh0ZXJub19jcnVkb19yZWdhbGlhcy5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JQ0KICByZW5hbWUoYW5pbyA9ICJBw5FPIiwNCiAgICAgICAgIG1lcyA9ICJNRVMiLA0KICAgICAgICAgdG90YWxfdGlwb19jcnVkbyA9ICJUT1RBTCBUSVBPIERFIENSVURPIikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9tMyIsDQogICAgICAgICBhbmlvID0gbmEubG9jZihhbmlvKSkgJT4lDQogIHNlbGVjdChhbmlvLCBtZXMsIHVuaWRhZCwgdG90YWxfdGlwb19jcnVkbywgZXZlcnl0aGluZyguKSwgLWMoQlJFTlQsIFdUSSkpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSAidGlwb19jcnVkbyIsDQogICAgICAgICB2YWx1ZSA9ICJ2YWxvciIsDQogICAgICAgICA1Om5jb2woLikpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUNCiAgc3VtbWFyaXNlKHByZWNpb190b3RhbF90aXBvX2NydWRvID0gbWVhbih0b3RhbF90aXBvX2NydWRvKSkgJT4lIA0KICAgICAgICAgICAgIyBwcmVjaW9fcHJvbWVkaW9fdGlwb19jcnVkbyA9IG1lYW4odmFsb3IpKSU+JSANCiAgbXV0YXRlKHRpcG9fcHJlY2lvID0gIm1lcmNhZG8gZXh0ZXJubyIsDQogICAgICAgICBwcmVjaW9fdG90YWxfdGlwb19jcnVkbyA9IGNvbnZlcnNvcl9tM2JibF9wKHByZWNpb190b3RhbF90aXBvX2NydWRvKSwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvYmFycmlsZXMiKQ0KDQojIE1lY29uIE1PRElGSUNBUiANCnByZWNpb19leHBvcnRhY2lvbl9jcnVkbyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL3ByZWNpby1leHBvcnRhY2lvbi1jcnVkby54bHN4IiwgDQogICAgc2tpcCA9IDIpDQoNCiNJTkRFQyBDb21FeA0KcHJlY2lvX2V4cG9faW5kZWMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0lOREVDL0NvbUV4L3ByZWNpb19hbnVhbF9wcm9tZWRpb19leHBvX2hpZHJvX2luZGVjLmNzdiIsICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbCAlPiUgc2VsZWN0KC1UQ1ApKSAgJT4lIA0KICBtdXRhdGUoIHByZWNpb19leHBvX2dhc19pbmRlYyA9IChwcmVjaW9fZXhwb19nYXNfaW5kZWMpICogVENDLA0KICAgICAgICAgICAgICAgICAgICAgIHVuaWRhZF9nYXMgPSAiYXJzL01pbGVzIGRlIG0zIgkpDQogICMgbXV0YXRlKHByZWNpb19leHBvX2dhc19pbmRlYyA9IHByZWNpb19leHBvX2dhc19pbmRlYyAqIFRDQywgDQogICMgICAgICAgIHVuaWRhZCA9IGNhc2Vfd2hlbih1bmlkYWQgPT0gIlVTRC9NaWxlcyBkZSBtMyIgfiAiYXJzL01pbGVzIGRlIG0zIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB1bmlkYWQpKQ0KDQojVU4gQ09NVFJBREUNCmV4cG9fY3J1ZG9fdW5jb210cmFkZV9ocyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvVU4gQ29tdHJhZGUvZXhwb19jcnVkb191bmNvbXRyYWRlX2hzLmNzdiIpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9wcmVjaW8gPSAiVVNEL2JhcnJpbGVzIiwNCiAgICAgICAgIHVuaWRhZF92YWxvciA9ICJVU0QiLA0KICAgICAgICAgdW5pZGFkX2NhbnRpZGFkID0gImJhcnJpbGVzIikgJT4lIA0KICByZW5hbWUoYW5pbyA9IFBlcmlvZCwNCiAgICAgICAgIHByZWNpb19leHBvX2NvbXRyYWRlX2hzX2NydWRvID0gZXhwb19wcmVjaW9fYmJsLCANCiAgICAgICAgIGV4cG9fdXNkX2NvbXRyYWRlX2NydWRvID0gIlRyYWRlIFZhbHVlIChVUyQpIikNCg0KZXhwb19jcnVkb19zaXRjIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9VTiBDb210cmFkZS9leHBvX2NydWRvX3NpdGMuY3N2IikgJT4lIA0KICBtdXRhdGUodW5pZGFkX3ByZWNpbyA9ICJVU0QvYmFycmlsZXMiLA0KICAgICAgICAgdW5pZGFkX3ZhbG9yID0gIlVTRCIsDQogICAgICAgICB1bmlkYWRfY2FudGlkYWQgPSAiYmFycmlsZXMiKSAlPiUgDQogIHJlbmFtZShhbmlvID0gUGVyaW9kLA0KICAgICAgICAgcHJlY2lvX2V4cG9fY29tdHJhZGVfc2l0Y19jcnVkbyA9IGV4cG9fcHJlY2lvX2JibCwgDQogICAgICAgICBleHBvX3VzZF9jb210cmFkZV9jcnVkbyA9ICJUcmFkZSBWYWx1ZSAoVVMkKSIpDQoNCiNNZXJnZSBiYXNlcw0KcHJlY2lvX2V4cG9fY3J1ZG8gPC0gcHJlY2lvX21lX3JlZ2FsaWFzX2NydWRvICU+JSANCiAgcmVuYW1lKHByZWNpb19leHBvX3JlZ2FsaWFzX2NydWRvID0gcHJlY2lvX3RvdGFsX3RpcG9fY3J1ZG8pICU+JSANCiAgc2VsZWN0KC10aXBvX3ByZWNpbykgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwcmVjaW9fZXhwb19tZWNvbl9jcnVkbyA9IHByZWNpb19jcnVkb19tZV91c2RfYmJsICkpICU+JQ0KICBsZWZ0X2pvaW4ocHJlY2lvX2V4cG9faW5kZWMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoLWMocHJlY2lvX2V4cG9fZ2FzX2luZGVjLCB1bmlkYWRfZ2FzKSkpICU+JQ0KICBsZWZ0X2pvaW4oZXhwb19jcnVkb191bmNvbXRyYWRlX2hzICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9wcmVjaW8sIHByZWNpb19leHBvX2NvbXRyYWRlX2hzX2NydWRvKSkgJT4lIA0KICBmdWxsX2pvaW4oZXhwb19jcnVkb19zaXRjICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9wcmVjaW8sIHByZWNpb19leHBvX2NvbXRyYWRlX3NpdGNfY3J1ZG8pKSAlPiUNCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogICMgbXV0YXRlKHByZWNpb19leHBvX2NydWRvID0gY2FzZV93aGVuKGFuaW8gPCAxOTkzIH4gcHJlY2lvX2V4cG9fY29tdHJhZGVfc2l0Y19jcnVkbywNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTkzOjIwMTQgfiBwcmVjaW9fZXhwb19tZWNvbl9jcnVkbywNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAyMDE0IH4gcHJlY2lvX2V4cG9fcmVnYWxpYXNfY3J1ZG8pKSAlPiUgDQogICMgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2V4cG9fY3J1ZG8sIGV2ZXJ5dGhpbmcoLiksIC1UQ0MpDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLiksIC1UQ0MpDQojIHByZWNpb19leHBvX2NydWRvDQoNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMjIyBQcmVjaW8gUmVmZXJlbmNpYSBNZXJjYWRvIEV4dGVybm8gQ3J1ZG8NCiNCcmVudA0KYnJlbnRfYSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1ByZWNpb3MvYnJlbnQueGxzeCIsIA0KICAgIHNraXAgPSA0KSU+JSAgDQogIHJlbmFtZShhbmlvID0gWWVhciwgYnJlbnRfbm9taW5hbCA9IGBOb21pbmFsIFByaWNlYCwgYnJlbnRfYWRqdXN0ZWQgPSBgSW5mbGF0aW9uIEFkanVzdGVkIFByaWNlYCkgICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvYmFycmlsZXMiLA0KICAgICAgICAgYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkgDQoNCg0KYnJlbnRfZGFpbHkgIDwtICByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1ByZWNpb3MvUkJSVEVkLnhscyIsIA0KICAgIHNoZWV0ID0gIkRhdGEgMSIsIHNraXAgPSAyKSAlPiUNCiAgcmVuYW1lKGZlY2hhID0gRGF0ZSwgYnJlbnRfc3BvdCA9IGBFdXJvcGUgQnJlbnQgU3BvdCBQcmljZSBGT0IgKERvbGxhcnMgcGVyIEJhcnJlbClgKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL2JhcnJpbGVzIiwNCiAgICAgICAgIGZlY2hhID0gYXMuRGF0ZShmZWNoYSksIA0KICAgICAgICAgYW5pbyA9IHllYXIoZmVjaGEpKSANCg0KYnJlbnRfSUVBICA8LSAgYnJlbnRfZGFpbHkgJT4lIA0KICBncm91cF9ieSh1bmlkYWQsIGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKGJyZW50X3Nwb3QgPSBtZWFuKGJyZW50X3Nwb3QpKQ0KDQpicmVudCA8LSBicmVudF9hICU+JQ0KICBzZWxlY3QoLWJyZW50X2FkanVzdGVkKSAlPiUgDQogIGxlZnRfam9pbihicmVudF9JRUEpICU+JSANCiAgbXV0YXRlKGRpZiA9IGJyZW50X3Nwb3QvYnJlbnRfbm9taW5hbCAtIDEpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkgJT4lIA0KICByZW5hbWUoYnJlbnRfaWVhID0gYnJlbnRfc3BvdCwNCiAgICAgICAgIGJyZW50X2hpc3RvcmljID0gYnJlbnRfbm9taW5hbCkNCg0KI1dUSSANCnd0aV9FSUFfZGFpbHkgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvRUlBL2RhdGEvUldUQ2QueGxzIiwgDQogICAgc2hlZXQgPSAiRGF0YSAxIiwgc2tpcCA9IDIpICU+JSANCiAgcmVuYW1lKHd0aV9laWEgPSBgQ3VzaGluZywgT0sgV1RJIFNwb3QgUHJpY2UgRk9CIChEb2xsYXJzIHBlciBCYXJyZWwpYCApICU+JSANCiAgbXV0YXRlKG1lcyA9IG1vbnRoKERhdGUpLA0KICAgICAgICAgYW5pbyA9IHllYXIoRGF0ZSksDQogICAgICAgICB1bmlkYWQgPSAiVVNEL2JhcnJpbGVzIikNCg0Kd3RpX0VJQSA8LSB3dGlfRUlBX2RhaWx5ICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZSh3dGlfZWlhID0gbWVhbih3dGlfZWlhLCBuYS5ybSA9IFQpKQ0KDQp3dGlfZnJlZCA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvRlJFRC9XVElTUExDLmNzdiIpICAlPiUNCiAgcmVuYW1lKHd0aV9zcG90X3ByaWNlID0gV1RJU1BMQykgJT4lIA0KICBtdXRhdGUoYW5pbyA9IHllYXIoREFURSksDQogICAgICAgICB1bmlkYWQgPSAiVVNEL2JhcnJpbGVzIikgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKHd0aV9zcG90X3ByaWNlX2ZyZWQgPSBtZWFuKHd0aV9zcG90X3ByaWNlKSkNCiAgDQp3dGlfcmV0ZW5jaW9uXzA0IDwtIHd0aV9FSUFfZGFpbHkgICU+JSANCiAgZmlsdGVyKGFuaW8gPiAyMDAzICkgJT4lIA0KICBncm91cF9ieShhbmlvLCBtZXMpICU+JSANCiAgc3VtbWFyaXNlKHd0aSA9IG1lYW4od3RpX2VpYSkpICU+JSANCiAgbXV0YXRlKHJldGVuY2lvbiA9IGNhc2Vfd2hlbih3dGkgPCAzMiB+IDAuMjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDMyICYgd3RpIDwgMzQuOTkgfiAwLjI4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSAzNSAmIHd0aSA8IDM2Ljk5IH4gMC4zMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gMzcgJiB3dGkgPCAzOC45OSB+IDAuMzQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDM5ICYgd3RpIDwgNDAuOTkgfiAwLjM3LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSA0MSAmIHd0aSA8IDQyLjk5IH4gMC40MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gNDMgJiB3dGkgPCA0NC45OSB+IDAuNDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDQ1IH4gMC40NSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UocmV0ZW5jaW9uID0gbWVhbihyZXRlbmNpb24pKQ0KDQoNCnd0aV9yZXRlbmNpb25fMDcgPC0gd3RpX0VJQV9kYWlseSAlPiUgDQogIGZpbHRlcihhbmlvICVpbiUgYyggMjAwNzoyMDE0KSwgRGF0ZSA+ICIyMDA3LTExLTAyIiApICU+JSANCiAgbXV0YXRlKHJldGVuY2lvbiA9IGNhc2Vfd2hlbih3dGlfZWlhID49IDYwLjkgfiAod3RpX2VpYSAtIDQyKS80MiAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpX2VpYSA8IDYwLjkgfiAwLjQ1KSkgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZSh3dGlfZWlhID0gbWVhbih3dGlfZWlhKSwNCiAgICAgICAgICAgIHJldGVuY2lvbiA9ICBtZWFuKHJldGVuY2lvbikpDQoNCmJyZW50X3JlbnRlbmNpb25fMTQgPC0gIGJyZW50X2RhaWx5ICU+JQ0KICAgZmlsdGVyKGFuaW8gJWluJSBjKCAyMDE0OjIwMTUpLCBmZWNoYSA+ICIyMDA3LTExLTAyIiApICU+JQ0KICBtdXRhdGUocmV0ZW5jaW9uID0gY2FzZV93aGVuKGJyZW50X3Nwb3QgPj0gNzEgfiAoYnJlbnRfc3BvdCAtIDcwKS83MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVudF9zcG90IDwgNzEgfiAwLjAxKSkgJT4lIA0KICAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoYnJlbnRfc3BvdCA9IG1lYW4oYnJlbnRfc3BvdCksDQogICAgICAgICAgICByZXRlbmNpb24gPSAgbWVhbihyZXRlbmNpb24pKQ0KICANCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojUHJlY2lvIGRlIGV4cG9ydGFjaW9uIHkgcmVmZXJlbmNpYS4gTWVyZ2UgZGUgYmFzZXMNCnByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8gPC0gIHByZWNpb19leHBvX2NydWRvICAlPiUgICANCiAgZnVsbF9qb2luKGJyZW50ICU+JSBzZWxlY3QoLWRpZikpICU+JSANCiAgbGVmdF9qb2luKHd0aV9FSUEgKSAlPiUgDQogIGZ1bGxfam9pbih3dGlfZnJlZCkgJT4lIA0KICBtdXRhdGUocHJlY2lvX2V4cG9fY3J1ZG9faW5kZWMgPSBjYXNlX3doZW4ocHJlY2lvX2V4cG9fY3J1ZG9faW5kZWMgPiAzMDAgfiBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBwcmVjaW9fZXhwb19jcnVkb19pbmRlYyksDQogICAgICAgICBwcmVjaW9fbWVfY3J1ZG8gPSBjYXNlX3doZW4oYW5pbyAlaW4lIDE5OTM6MjAwMSB8IGFuaW8gJWluJSAyMDA0OjIwMTQgfiBwcmVjaW9fZXhwb19tZWNvbl9jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvICVpbiUgMjAwMjoyMDAzIH4gcHJlY2lvX2V4cG9fY29tdHJhZGVfaHNfY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDIwMTQgfiBwcmVjaW9fZXhwb19yZWdhbGlhc19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvKSB+IGJyZW50X2hpc3RvcmljLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPCAxOTkzIH4gcHJlY2lvX2V4cG9fY29tdHJhZGVfc2l0Y19jcnVkbykpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX21lX2NydWRvLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBmaWx0ZXIoYW5pbyA8IDIwMjEpDQoNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8sIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9wcmVjaW9fZXhwb195X21kb19tdW5kaWFsX2NydWRvLnhsc3giKQ0KcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogIHNlbGVjdCgtcHJlY2lvX21lX2NydWRvKQ0KDQoNCmdyYWZfcHJlY2lvX21kb19tdW5kaWFsX2NydWRvIDwtIHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8gJT4lIA0KICBzZWxlY3QoLXByZWNpb19tZV9jcnVkbykgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19wcmVjaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMzpuY29sKC4pKSAlPiUNCiAgIyBmaWx0ZXIoISh0aXBvX3ByZWNpbyAlaW4lIGMoInByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZSIsICJwcmVjaW9faW1wb19nYXNfYm9saXZpYV9NTUJUVV9jb210cmFkZSIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVjaW9fZXhwb19nYXNfY29tdHJhZGUiLCAicHJlY2lvX2V4cG9fZ2FzX2luZGVjIikpKSAlPiUNCiAgIyBmaWx0ZXIoYW5pbyAhPSAyMDAyICYgdGlwb19wcmVjaW8gIT0gInByZWNpb19leHBvX2NydWRvX2luZGVjIikgJT4lDQogIGdncGxvdChhZXMoeCA9IGFuaW8sIHkgPSB2YWxvciwgY29sb3IgPSB0aXBvX3ByZWNpbykpKw0KICBnZW9tX2xpbmUoYWxwaGEgPSAwLjkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlByZWNpb3MgZGUgZXhwb3J0YWNpw7NuIHkgcmVmZXJlbmNpYSBkZWwgbWVyY2FkbyBtdW5kaWFsIGRlbCBjcnVkbyIsIA0KICAgICAgIHkgPSAiVVNEL2JhcnJpbGVzIikNCg0KZ2dwbG90bHkoZ3JhZl9wcmVjaW9fbWRvX211bmRpYWxfY3J1ZG8sIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCmBgYA0KDQojIyMjIFByZWNpb3MgZGUgUmVmZXJlbmNpYSBkZWwgR2FzDQoNCiogQ3JpdGVyaW8gZGUgcHJlY2lvX2V4dGVybm9fZ2FzOg0KICArIEHDsW9zIDE5NjQgeSAxOTY1OiBQcmVjaW8gZGUgaW1wb3J0YWNpw7NuIGRlIGdhcyBwcm92ZW5pZW50ZSBkZSBCb2xpdmlhIGhhY2lhIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZQ0KICArIDE5NjYgZW4gYWRlbGFudGU6IFByZWNpbyBkZSBleHBvcnRhY2lvbiBkZSBnYXMgZGVzZGUgQm9saXZpYSBhIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZQ0KICArIERhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyBwcmV2aW9zIGEgMTk2MyB5IHBlcsOtb2RvIDE5NjgtMTk3MQ0KDQojIyMjIyBFeHBvcnRhY2nDs24gQXJnZW50aW5hDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgUHJlY2lvIGRlIEV4cG9ydGFjacOzbiBkZWwgR2FzIA0KI3JlZ2FsaWFzDQpwcmVjaW9fZXhwb19yZWdhbGlhc19nYXMgPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZWdhbGlhcy9wcmVjaW9fbWVyY2Fkb19leHRlcm5vX2dhc19yZWdhbGlhcy5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JQ0KICAgcmVuYW1lKGFuaW8gPSAiQcORTyIsDQogICAgICAgICBtZXMgPSAiTUVTIiwNCiAgICAgICAgIHRvdGFsX2N1ZW5jYSA9ICJUT1RBTCBDVUVOQ0EiKSAlPiUgDQogICBtdXRhdGUodW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIsDQogICAgICAgICAgYW5pbyA9IG5hLmxvY2YoYW5pbykpICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIGdhdGhlciguLA0KICAgICAgICAga2V5ID0gImN1ZW5jYSIsDQogICAgICAgICB2YWx1ZSA9ICJ2YWxvciIsDQogICAgICAgICA0Om5jb2woLikpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkLCBjdWVuY2EpICU+JQ0KICBtdXRhdGUodmFsb3IgPSBnc3ViKCIsIiwgIiIsIHZhbG9yKSwNCiAgICAgICAgIHZhbG9yID0gYXMuZG91YmxlKHZhbG9yKSkgJT4lICANCiAgc3VtbWFyaXNlKHByZWNpb19leHBvX2dhc19yZWdhbGlhcyA9IG1lYW4odmFsb3IsIG5hLnJtID0gVCkpICU+JSANCiAgbXV0YXRlKHRpcG9fcHJlY2lvID0gIm1lcmNhZG8gZXh0ZXJubyIpICU+JQ0KICBmaWx0ZXIoY3VlbmNhID09ICJ0b3RhbF9jdWVuY2EiKSU+JQ0KICBhcnJhbmdlKGFuaW8pDQoNCiNjb210cmFkZQ0KZXhwb19nYXNfY29tdHJhZGUgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL1VOIENvbXRyYWRlL3Jlc3VsdGFkb3MvZXhwb19nYXNfc2l0Yy5jc3YiKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KGFuaW8sIHRjYykpICU+JSANCiAgbXV0YXRlKGV4cG9fcHJlY2lvX01NQlRVID0gY29udmVyc29yX20zTU1CVFVfcChleHBvX3ByZWNpb19NbTMgKSwNCiAgICAgICAgIGV4cG9fcHJlY2lvX01tM19hcnMgPSBleHBvX3ByZWNpb19NbTMgKiB0Y2MpIA0KDQojbWVyZ2UgZGUgYmFzZXMNCiNwcmVjaW8gZW4gcGVzb3MNCnByZWNpb19leHBvX2dhcyA8LSBleHBvX2dhc19jb210cmFkZSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZXhwb19nYXNfY29tdHJhZGUgPSBleHBvX3ByZWNpb19NbTNfYXJzKSAlPiUgDQogIGZ1bGxfam9pbihwcmVjaW9fZXhwb19yZWdhbGlhc19nYXMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoLWMoY3VlbmNhLCB0aXBvX3ByZWNpbykpKSAlPiUNCiAgbGVmdF9qb2luKHByZWNpb19leHBvX2luZGVjICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX2dhcywgcHJlY2lvX2V4cG9fZ2FzX2luZGVjKSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcighKGlzLm5hKHByZWNpb19leHBvX2dhc19pbmRlYykpKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwcmVjaW9fZXhwb19nYXNfbWVjb24gPSBwcmVjaW9fZ2FzX21lX3Blc29zX01tMykpDQoNCg0KI3ByZWNpb3MgZW4gZG9sYXJlcw0KcHJlY2lvX2V4cG9fZ2FzX3VzZCA8LSBleHBvX2dhc19jb210cmFkZSAgJT4lICANCiAgc2VsZWN0KGFuaW8sICBwcmVjaW9fZXhwb19nYXNfY29tdHJhZGUgPSBleHBvX3ByZWNpb19NTUJUVSkgJT4lDQogIGxlZnRfam9pbiggcHJlY2lvX2V4cG9fZ2FzICU+JSBzZWxlY3QoLWMocHJlY2lvX2V4cG9fZ2FzX2NvbXRyYWRlLCB1bmlkYWQpKSwgYnkgPSAiYW5pbyIpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbCAlPiUgc2VsZWN0KC1UQ1ApKSAlPiUNCiAgbXV0YXRlKHByZWNpb19leHBvX2dhc19yZWdhbGlhcyA9IChwcmVjaW9fZXhwb19nYXNfcmVnYWxpYXMvMTAwMCkgLyBUQ0MsIA0KICAgICAgICAgcHJlY2lvX2V4cG9fZ2FzX2luZGVjID0gKHByZWNpb19leHBvX2dhc19pbmRlYyApLyBUQ0MsIA0KICAgICAgICAgcHJlY2lvX2V4cG9fZ2FzX21lY29uID0gKHByZWNpb19leHBvX2dhc19tZWNvbi8xMDAwKS8gVENDLA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9NTUJUVSIpICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYygicHJlY2lvX2V4cG9fZ2FzX3JlZ2FsaWFzIiwgInByZWNpb19leHBvX2dhc19pbmRlYyIsICJwcmVjaW9fZXhwb19nYXNfbWVjb24iKSwNCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zTU1CVFVfcCkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pLC1UQ0MpDQoNCg0KYGBgDQoNCiMjIyMjIFJlZmVyZW5jaWFzIG11bmRpYWxlcw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMjIFByZWNpbyBSZWZlcmVuY2lhIE1lcmNhZG8gRXh0ZXJubyBHYXMgDQojIyMjIFByZWNpb3MgTXVuZGlhbGVzDQojaGVucnlfaHViIEVJQQ0KaGVucnlfaHViIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUHJlY2lvcy9STkdXSEhEZC54bHMiLCANCiAgICBzaGVldCA9ICJEYXRhIDEiLCBza2lwID0gMikgJT4lIA0KICByZW5hbWUoIGRhdGUgPSBEYXRlLA0KICAgIGhlbnJ5X2h1Yl9zcG90ID0gYEhlbnJ5IEh1YiBOYXR1cmFsIEdhcyBTcG90IFByaWNlIChEb2xsYXJzIHBlciBNaWxsaW9uIEJ0dSlgKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL01NQlRVIiwNCiAgICAgICAgIGFuaW8gPSB5ZWFyKGRhdGUpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UoZWlhX2hlbnJ5X2h1Yl9zcG90ID0gbWVhbihoZW5yeV9odWJfc3BvdCwgbmEucm0gPSBUKSkgDQoNCmhlbnJ5X2h1Yl9hcnMgPC0gIGhlbnJ5X2h1YiAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWwgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgVENDKSkgJT4lIA0KICBtdXRhdGUoaGVucnlfaHViX3Nwb3QgPSBjb252ZXJzb3JfTU1CVFVtM2dhc19wKGVpYV9oZW5yeV9odWJfc3BvdCAqMTAwMCpUQ0MpLA0KICAgICAgICAgdW5pZGFkPSAiYXJzL01pbGVzIGRlIG0zIikNCg0KIyBQcmVjaW8gVVNBIGJvY2EgZGUgcG96byBFSUEgICAgICAgICAgdW5pZGFkID0gIlVTRC9mdDMiDQp3ZWxsaGVhZF9wcmljZV9lZXV1IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0VJQS9kYXRhL25hdHVyYWxfZ2FzX3dlbGxoZWFkX3ByaWNlX2VldXUueGxzIiwgDQogICAgc2hlZXQgPSAiRGF0YSAxIiwgc2tpcCA9IDIpICU+JSANCiAgcmVuYW1lKHVzX3dlbGxoZWFkX3ByaWNlX2Z0MyA9ICJVLlMuIE5hdHVyYWwgR2FzIFdlbGxoZWFkIFByaWNlIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KSIpICU+JSAgDQogIG11dGF0ZSggdXNfd2VsbGhlYWRfcHJpY2VfTW0zID0gY29udmVyc29yX2Z0M20zX3AodXNfd2VsbGhlYWRfcHJpY2VfZnQzKjEwMDApLA0KICAgICAgICAgIHVzX3dlbGxoZWFkX3ByaWNlX01NQlRVID0gY29udmVyc29yX2Z0M01NQlRVX3AodXNfd2VsbGhlYWRfcHJpY2VfZnQzLzEwMDApLA0KICAgICAgICAgIGFuaW8gPSB5ZWFyKERhdGUpLA0KICAgICAgICAgdW5pZGFkICA9ICJVU0QiKSANCg0KI290cm9zIHByZWNpb3MgZGUgVVNBIEVJQQ0KcHJpY2VfZWV1dSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9FSUEvZGF0YS9uYXR1cmFsX2dhc19wcmljZXNfdXNhLnhscyIsIA0KICAgIHNoZWV0ID0gIkRhdGEgMSIsIHNraXAgPSAyKSAlPiUgDQogIHJlbmFtZSh1c193ZWxsaGVhZF9nYXNfcHJpY2UgPSBgVS5TLiBOYXR1cmFsIEdhcyBXZWxsaGVhZCBQcmljZSAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgLA0KICAgICAgICAgdXNfaW1wb3J0X2dhc19wcmljZSA9IGBQcmljZSBvZiBVLlMuIE5hdHVyYWwgR2FzIEltcG9ydHMgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpYCwNCiAgICAgICAgIHVzX3BpcGVsaW5lX2ltcG9ydF9wcmljZSA9IGBVLlMuIE5hdHVyYWwgR2FzIFBpcGVsaW5lIEltcG9ydHMgUHJpY2UgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpYCwNCiAgICAgICAgIHVzX2xuZ19pbXBvcnRfcHJpY2UgPSBgUHJpY2Ugb2YgVS5TLiBOYXR1cmFsIEdhcyBMTkcgSW1wb3J0cyAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgLA0KICAgICAgICAgdXNfZXhwb3J0X2dhc19wcmljZSA9IGBQcmljZSBvZiBVLlMuIE5hdHVyYWwgR2FzIEV4cG9ydHMgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpYCwNCiAgICAgICAgIHVzX2V4cG9ydF9nYXNfcGlwZWxpbmVfcHJpY2UgPSBgUHJpY2Ugb2YgVS5TLiBOYXR1cmFsIEdhcyBQaXBlbGluZSBFeHBvcnRzIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWAsDQogICAgICAgICB1c19leHBvcnRfbG5nX3ByaWNlID0gYFByaWNlIG9mIExpcXVlZmllZCBVLlMuIE5hdHVyYWwgR2FzIEV4cG9ydHMgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpYCkgJT4lIA0KICBzZWxlY3QodXNfd2VsbGhlYWRfZ2FzX3ByaWNlLCB1c19pbXBvcnRfZ2FzX3ByaWNlLCB1c19waXBlbGluZV9pbXBvcnRfcHJpY2UsDQogICAgICAgIHVzX2xuZ19pbXBvcnRfcHJpY2UsIHVzX2V4cG9ydF9nYXNfcHJpY2UsDQogICAgICAgIHVzX2V4cG9ydF9nYXNfcGlwZWxpbmVfcHJpY2UsIHVzX2V4cG9ydF9sbmdfcHJpY2UgKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMTkyMjoyMDE5KQ0KICANCg0KcHJpY2VfZWV1dV9NbTMgPC0gIHByaWNlX2VldXUgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpe2NvbnZlcnNvcl9mdDNtM19wKCAxMDAwKX0pICU+JSANCiAgbXV0YXRlKGFuaW8gPSAxOTIyOjIwMTksDQogICAgICAgICB1bmlkYWQgPSAiVVNEL01pbGVzIGRlIG0zIikgDQoNCnByaWNlX2VldXVfTU1CVFUgPC0gIHByaWNlX2VldXUgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpe2NvbnZlcnNvcl9mdDNNTUJUVV9wKHggLzEwMDApfSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDE5MjI6MjAxOSwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvTU1CVFUiKSAgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKQ0KICANCg0KI2V1cm9zdGF0DQoNCg0KI0JQDQpicF9nYXNfcHJpY2VzIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0JQL2JwLXN0YXRzLXJldmlldy0yMDIwLWFsbC1kYXRhLnhsc3giLCANCiAgICBzaGVldCA9ICJHYXMgLSBQcmljZXMgIiwgc2tpcCA9IDMpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAuLi4xLCANCiAgICAgICAgIGJwX2xuZ19qYXBhbl9jaWYgPSBKYXBhbiwNCiAgICAgICAgIGJwX2xuZ19qa20gPSAiSmFwYW4gS29yZWEgTWFya2VyIiwNCiAgICAgICAgIGJwX2dhc19nZXJtYW5faW1wb3J0X3ByaWNlID0gIkF2ZXJhZ2UgR2VybWFuIiwNCiAgICAgICAgIGJwX2dhc19uYnAgPSBVSywNCiAgICAgICAgIGJwX2dhc19uZXRoZXJsYW5kc190dGYgPSAiTmV0aGVybGFuZHMgVFRGIiwNCiAgICAgICAgIGJwX2dhc19oZW5yeV9odWIgPSBVUywNCiAgICAgICAgIGJwX2dhc19jYW5hZGEgPSBDYW5hZGEsIA0KICAgICAgICAgYnBfb2lsX21peF9tZWFuX29lY2QgPSBPRUNEKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIGZpbHRlcighaXMubmEoYW5pbykpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvTU1CVFUiKQ0KDQpicF9nYXNfMjAxNiA8LSBicF9nYXNfcHJpY2VzICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGJwX2xuZ19qa20sIGJwX2dhc19oZW5yeV9odWIsIGJwX2dhc19uZXRoZXJsYW5kc190dGYgKSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihhbmlvID09IDIwMTYpDQoNCg0KI0ZNSQ0KZm1pX3ByaWNlcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvRk1JL1BDUFNfMDktMTYtMjAyMCAxNS0wNy0xMC02Nl90aW1lU2VyaWVzLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDM4ID0gY29sX3NraXAoKSkpDQoNCmZtaV9nYXNfcHJpY2UgPC0gZm1pX3ByaWNlcyAlPiUgDQogIGZpbHRlcihgQ29tbW9kaXR5IE5hbWVgICVpbiUgYygiTmF0dXJhbCBnYXMsIEVVIiwiTmF0dXJhbCBHYXMsIFVTIEhlbnJ5IEh1YiBHYXMiLCJMTkcsIEFzaWEiICApLA0KICAgICAgICAgYFVuaXQgTmFtZWAgPT0gIkluZGV4IikgJT4lIA0KICByZW5hbWUoY29tbW9kaXR5ID0gIkNvbW1vZGl0eSBOYW1lIiwNCiAgICAgICAgIHVuaWRhZCA9ICJVbml0IE5hbWUiKSAlPiUgDQogIGdhdGhlciguLA0KICAgICAgICAga2V5ID0gYW5pbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsIA0KICAgICAgICAgICA4Om5jb2woLikpICU+JSANCiAgc2VsZWN0KGNvbW1vZGl0eSwgYW5pbywgdmFsb3IsIHVuaWRhZCApICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgLyAxMDAsDQogICAgICAgICBhbmlvID0gYXMuZG91YmxlKGFuaW8pKSAlPiUgDQogIHNwcmVhZCguLA0KICAgICAgICAga2V5ID0gY29tbW9kaXR5LCANCiAgICAgICAgIHZhbHVlID0gdmFsb3IpICU+JSANCiAgcmVuYW1lKGZtaV9sbmdfYXNpYSA9ICJMTkcsIEFzaWEiLA0KICAgICAgICAgZm1pX25hdHVyYWxfZ2FzX2V1ID0iTmF0dXJhbCBnYXMsIEVVIiwNCiAgICAgICAgIGZtaV9oZW5yeV9odWIgPSAiTmF0dXJhbCBHYXMsIFVTIEhlbnJ5IEh1YiBHYXMiKSAlPiUgDQogIG11dGF0ZShmbWlfbG5nX2FzaWEgPSBmbWlfbG5nX2FzaWEgKiBicF9nYXNfMjAxNiRicF9sbmdfamttLA0KICAgICAgICAgZm1pX2hlbnJ5X2h1YiA9ICBmbWlfaGVucnlfaHViICogYnBfZ2FzXzIwMTYkYnBfZ2FzX2hlbnJ5X2h1YiwNCiAgICAgICAgIGZtaV9uYXR1cmFsX2dhc19ldSA9IGZtaV9uYXR1cmFsX2dhc19ldSAqIGJwX2dhc18yMDE2JGJwX2dhc19uZXRoZXJsYW5kc190dGYsDQogICAgICAgICB1bmlkYWQgPSAiVVNEL01NQlRVIikNCg0KDQojIHVuaXF1ZShmbWlfcHJpY2VzJGBDb21tb2RpdHkgTmFtZWApDQojIHVuaXF1ZShmbWlfcHJpY2VzJGBVbml0IE5hbWVgKQ0KIyB1bmlxdWUoZm1pX3ByaWNlcyRgQ291bnRyeSBOYW1lYCkNCmBgYA0KDQoNCiMjIyMjIEJvbGl2aWENCiANCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMjIyMgUHJlY2lvIGRlIGltcG9ydGFjacOzbiBkZSBCb2xpdmlhDQojUHJlY2lvIGltcG8gYm9saXZpYSByZXZpc3RhIElERUUNCnByZWNpb19pZGVlX2ltcG9fZ2FzIDwtIGN1YWRyb180LjMgICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZF9nYXMsIHByZWNpb19nYXNfYm9saXZpYSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzcwKSkgJT4lDQogIG11dGF0ZShwcmVjaW9fZ2FzX2JvbGl2aWFfaWRlZSA9IHByZWNpb19nYXNfYm9saXZpYSAqIGlwY183MCAvIGNvbnZlcnNvcl9wZXNvcyRgJExleWAsDQogICAgICAgICB1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdChhbmlvLCB0Y2MpKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUgPSBwcmVjaW9fZ2FzX2JvbGl2aWFfaWRlZSAvdGNjKQ0KDQoNCiNwcmVjaW8gQm9saXZpYSBZUEZCIGVuIFVTRCAob3JpZ2luYWwpDQojIGEgbTMNCnByZWNpb19leHBvX2JvbGl2aWFfdXNkX3lwZmIgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9QcmVjaW9zL3ByZWNpb19leHBvX2JvbGl2aWEueGxzeCIpICU+JQ0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcmVjaW9fZXhwb19ib2xpdmlhX2FyZ19nYXMiLCAicHJlY2lvX2V4cG9fYm9saXZpYV9iemxfZ2FzIiksDQogICAgICAgICAgICAuZnVucyA9IGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfZnQzbTNfcCh4KX0pICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvTWlsZXMgZGUgbTMiKQ0KDQoNCiMgYSBNTSBCVFUNCnByZWNpb19leHBvX2JvbGl2aWFfdXNkX01NQlRVX3lwZmIgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9QcmVjaW9zL3ByZWNpb19leHBvX2JvbGl2aWEueGxzeCIpICU+JQ0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcmVjaW9fZXhwb19ib2xpdmlhX2FyZ19nYXMiLCAicHJlY2lvX2V4cG9fYm9saXZpYV9iemxfZ2FzIiksDQogICAgICAgICAgICAuZnVucyA9IGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfZnQzTU1CVFVfcCh4LzEwMDApfSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9NTUJUVSIpICU+JSANCiAgcmVuYW1lKHByZWNpb19leHBvX2JvbGl2aWFfYXJnX3lwZmIgPSBwcmVjaW9fZXhwb19ib2xpdmlhX2FyZ19nYXMsDQogICAgICAgICBwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF95cGZiID0gcHJlY2lvX2V4cG9fYm9saXZpYV9iemxfZ2FzKSAgDQoNCg0KI3ByZWNpbyBib2xpdmlhIGVuIHBlc29zIA0KI3N1bWFybGUgZWwgZmxldGUgPSAwLjAyNDEyOTc5NA0KcHJlY2lvX2V4cG9fYm9saXZpYV9wZXNvc195cGZiIDwtICBwcmVjaW9fZXhwb19ib2xpdmlhX3VzZF95cGZiICU+JSANCiAgICBsZWZ0X2pvaW4odGNwX2FudWFsKSAlPiUNCiAgbXV0YXRlKHByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhc19wZXNvcyA9IHByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhcyAqIFRDQyAsIA0KICAgICAgICAgcHJlY2lvX2V4cG9fYm9saXZpYV9iemxfZ2FzX3Blc29zID0gcHJlY2lvX2V4cG9fYm9saXZpYV9iemxfZ2FzICogVENDLA0KICAgICAgICAgdW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIpDQoNCg0KI3ByZWNpbyBpbXBvIGRlIGFyZ2VudGluYSBkZXNkZSBib2xpdmlhIFVOIENvbXRyYWRlDQpnYXNfaW1wb19ib2xpdmlhX2NvbXRyYWRlX3VzZCA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvVU4gQ29tdHJhZGUvcmVzdWx0YWRvcy9nYXNfaW1wb19ib2xpdmlhX2NvbXRyYWRlLmNzdiIpICU+JQ0KICBzZWxlY3QoUGVyaW9kLCAiVHJhZGUgRmxvdyIsIFJlcG9ydGVyLCBQYXJ0bmVyLCAiQ29tbW9kaXR5IENvZGUiLCBDb21tb2RpdHksDQogICAgICAgICBRdHksIHRyYWRlX3ZhbHVlX3VzZCwgcHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWEsIHVuaWRhZF9wcmVjaW8sIHVuaWRhZF9jYW50aWRhZCkgJT4lIA0KICByZW5hbWUoYW5pbyA9IFBlcmlvZCkgJT4lIA0KICBtdXRhdGUocHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWFfTU1CVFVfY29tdHJhZGUgPSBjb252ZXJzb3JfbTNNTUJUVV9wKHByZWNpb19pbXBvX2dhc19ib2xpdmlhKSwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvTU1CVFUiKQ0KDQojcGFzYWplIGEgcGVzb3MNCmdhc19pbXBvX2JvbGl2aWFfY29tdHJhZGUgPC0gZ2FzX2ltcG9fYm9saXZpYV9jb210cmFkZV91c2QgICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUocHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWEgPSBwcmVjaW9faW1wb19nYXNfYm9saXZpYSAqIHRjYywNCiAgICAgICAgIHVuaWRhZF9wcmVjaW8gPSAiYXJzL01pbGVzIGRlIG0zIikNCg0KDQojcHJlY2lvIGV4cG8gYm9saXZpYSBVTiBDT01UUkFERQ0KZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZV91c2QgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL1VOIENvbXRyYWRlL3Jlc3VsdGFkb3MvZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZS5jc3YiKSAlPiUNCiAgc2VsZWN0KFBlcmlvZCwgIlRyYWRlIEZsb3ciLCBSZXBvcnRlciwgUGFydG5lciwgIkNvbW1vZGl0eSBDb2RlIiwgQ29tbW9kaXR5LA0KICAgICAgICAgUXR5LCB0cmFkZV92YWx1ZV91c2QsIHByZWNpb19leHBvX2dhc19ib2xpdmlhLCB1bmlkYWRfcHJlY2lvLCB1bmlkYWRfY2FudGlkYWQpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBQZXJpb2QpICU+JSANCiAgIG11dGF0ZShwcmVjaW9fZXhwb19nYXNfYm9saXZpYV9hcmdfTU1CVFVfY29tdHJhZGUgPSBjb252ZXJzb3JfbTNNTUJUVV9wKHByZWNpb19leHBvX2dhc19ib2xpdmlhKSwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvTU1CVFUiKQ0KDQojcGFzYWplIGEgcGVzb3MNCmdhc19leHBvX2JvbGl2aWFfY29tdHJhZGUgPC0gIGdhc19leHBvX2JvbGl2aWFfY29tdHJhZGVfdXNkICU+JQ0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IsIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fZXhwb19nYXNfYm9saXZpYSA9IHByZWNpb19leHBvX2dhc19ib2xpdmlhICogdGNjLA0KICAgICAgICAgdW5pZGFkX3ByZWNpbyA9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KYGBgDQoNCiMjIyMjIFRvZG9zIGxvcyBwcmVjaW9zDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1ByZWNpbyBkZSBleHBvcnRhY2lvbiB5IHJlZmVyZW5jaWEgZGUgR2FzLiBNZXJnZSBkZSBiYXNlcw0KDQojcHJlY2lvcyBlbiB1c2QNCnByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSA8LSBwcmljZV9lZXV1X01NQlRVICU+JSANCiAgbGVmdF9qb2luKCAgaGVucnlfaHViKSAlPiUNCiAgbGVmdF9qb2luKGJwX2dhc19wcmljZXMpICU+JSANCiAgbGVmdF9qb2luKGZtaV9nYXNfcHJpY2UpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19leHBvX2JvbGl2aWFfdXNkX01NQlRVX3lwZmIpICU+JSANCiAgbGVmdF9qb2luKGdhc19pbXBvX2JvbGl2aWFfY29tdHJhZGVfdXNkICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2ltcG9fZ2FzX2FyZ19ib2xpdmlhX2NvbXRyYWRlID0gcHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWFfTU1CVFVfY29tdHJhZGUpKSAlPiUgDQogIGxlZnRfam9pbihnYXNfZXhwb19ib2xpdmlhX2NvbXRyYWRlX3VzZCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIA0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWFfYXJnX2NvbXRyYWRlID0gcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWFfYXJnX01NQlRVX2NvbXRyYWRlKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX2lkZWVfaW1wb19nYXMgJT4lIHNlbGVjdChhbmlvLCBwcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUpKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fZXhwb19nYXNfdXNkKSAlPiUgDQogIG11dGF0ZShwcmVjaW9faW1wb19nYXNfYm9saXZpYV9pZGVlID0gY29udmVyc29yX20zTU1CVFVfcChwcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUvMTAwMCksI29rDQogICAgICAgICBwcmVjaW9fZXh0ZXJub19nYXMgPSBjYXNlX3doZW4oIGFuaW8gPCAxOTY2IH4gcHJlY2lvX2ltcG9fZ2FzX2FyZ19ib2xpdmlhX2NvbXRyYWRlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUfiBwcmVjaW9fZXhwb19nYXNfYm9saXZpYV9hcmdfY29tdHJhZGUpKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19leHRlcm5vX2dhcywgZXZlcnl0aGluZyguKSwgLXByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZSkgJT4lIA0KICBmaWx0ZXIoYW5pbyA8IDIwMjEpDQoNCnByZWNpb19tZG9tdW5kaWFsX2dhc19iZXAgPC0gcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVICU+JQ0KICBzZWxlY3QoLXVuaWRhZCkgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIG11dGF0ZV9hbGwoY29udmVyc29yX01NQlRVYmVwX3ApICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvYmVwIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKQ0KDQpjb21wYXJhY2lvbl9iZXAgPC0gcHJlY2lvX21kb211bmRpYWxfZ2FzX2JlcCAlPiUgDQogICAgIyBzZWxlY3QoYW5pbywgcHJlY2lvX2V4dGVybm9fZ2FzKSAlPiUNCiAgbGVmdF9qb2luKHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgYnJlbnRfaGlzdG9yaWMsIHd0aV9zcG90X3ByaWNlX2ZyZWQsDQogICAgICAgICAgICAgICAgICAgICBwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvKSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9iZXAiKQ0KICANCiMgcHJlY2lvX21kb211bmRpYWxfZ2FzX01tMyA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lDQojICAgc2VsZWN0KC11bmlkYWQpICU+JSANCiMgICBncm91cF9ieShhbmlvKSAlPiUgDQojICAgbXV0YXRlX2FsbChjb252ZXJzb3JfbTNNTUJUVV9wKSAlPiUgDQojICAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvYmVwIikgJT4lIA0KIyAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpDQogIA0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdChNTUJUVSA9IHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICBCRVAgPSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfYmVwKSwgcGF0aCA9ICJyZXN1bHRhZG9zL3ByZWNpb19tZG9fbXVuZGlhbF9nYXMueGxzeCIpDQoNCiNncmFmaWNvIHByZWNpb3MgYmVwDQpncmFmX3ByZWNpb19tZG9fbXVuZGlhbF9nYXNfYmVwIDwtIHByZWNpb19tZG9tdW5kaWFsX2dhc19iZXAgJT4lIA0KICBzZWxlY3QoLXByZWNpb19leHRlcm5vX2dhcykgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19wcmVjaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMzpuY29sKC4pKSAlPiUNCiAgIyBmaWx0ZXIoISh0aXBvX3ByZWNpbyAlaW4lIGMoInByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZSIsICJwcmVjaW9faW1wb19nYXNfYm9saXZpYV9NTUJUVV9jb210cmFkZSIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVjaW9fZXhwb19nYXNfY29tdHJhZGUiLCAicHJlY2lvX2V4cG9fZ2FzX2luZGVjIikpKSAlPiUNCiAgZmlsdGVyKCEodGlwb19wcmVjaW8gJWluJSBjKCJwcmVjaW9fZXhwb19nYXNfaW5kZWMiKSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYW5pbywgeSA9IHZhbG9yLCBjb2xvciA9IHRpcG9fcHJlY2lvKSkrDQogIGdlb21fbGluZSgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHkgPSAiVVNEL2JlcCIpDQojIHBsb3RseTo6Z2dwbG90bHkoZ3JhZl9wcmVjaW9fbWRvX211bmRpYWxfZ2FzX2JlcCkNCg0KZ3JhZl9wcmVjaW9fbWRvX211bmRpYWxfZ2FzX21tYnR1IDwtIHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSAlPiUgDQogIGZpbHRlcihwcmVjaW9fZXh0ZXJub19nYXMgPCAyNSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19wcmVjaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMzpuY29sKC4pKSAlPiUNCiAgZmlsdGVyKA0KICAgIHZhbG9yIDwgMjUsDQogICAgISh0aXBvX3ByZWNpbyAlaW4lIGMoImJwX29pbF9taXhfbWVhbl9vZWNkIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAsICJwcmVjaW9fZXhwb19nYXNfaW5kZWMiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJwcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAicHJlY2lvX2ltcG9fZ2FzX2FyZ19ib2xpdmlhX2NvbXRyYWRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgInByZWNpb19leHBvX2dhc19jb210cmFkZSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKSAlPiUNCiAgIyBmaWx0ZXIoISh0aXBvX3ByZWNpbyAlaW4lIGMoInByZWNpb19leHBvX2dhc19pbmRlYyIpKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBhbmlvLCB5ID0gdmFsb3IsIGNvbG9yID0gdGlwb19wcmVjaW8pKSsNCiAgZ2VvbV9saW5lKCkgKw0KICAjIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikrDQogIGxhYnModGl0bGUgPSAiUHJlY2lvcyBkZSBleHBvcnRhY2nDs24geSByZWZlcmVuY2lhIGRlbCBtZXJjYWRvIG11bmRpYWwgZGVsIGdhcyIsIA0KICAgICAgIHkgPSAiVVNEL01NQlRVIikNCmdncGxvdGx5KGdyYWZfcHJlY2lvX21kb19tdW5kaWFsX2dhc19tbWJ0dSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCg0KDQojcHJlY2lvcyBlbiBhcnMuIElOQ09NUExFVE8NCnByZWNpb19leHBvX3lfbWVfZ2FzIDwtIHByZWNpb19leHBvX2dhcyAlPiUNCiAgZnVsbF9qb2luKHByZWNpb19pZGVlX2ltcG9fZ2FzICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2dhc19ib2xpdmlhX2lkZWUpKSAlPiUgDQogIGZ1bGxfam9pbihwcmVjaW9fZXhwb19ib2xpdmlhX3Blc29zX3lwZmIgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCANCiAgICAgICAgICAgICAgICAgICAgIHByZWNpb19ib2xpdmlhX3lwZmIgPSBwcmVjaW9fZXhwb19ib2xpdmlhX2FyZ19nYXNfcGVzb3MgKSkgJT4lIA0KICBmdWxsX2pvaW4oZ2FzX2ltcG9fYm9saXZpYV9jb210cmFkZSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfcHJlY2lvLA0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWFfY29tdHJhZGUgPSBwcmVjaW9faW1wb19nYXNfYm9saXZpYSApKSAlPiUgDQogIGxlZnRfam9pbihnYXNfZXhwb19ib2xpdmlhX2NvbXRyYWRlICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9wcmVjaW8sIA0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWFfY29tdHJhZGUgPSBwcmVjaW9fZXhwb19nYXNfYm9saXZpYSApKSAlPiUNCiAgbGVmdF9qb2luKGhlbnJ5X2h1YikgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fZXhwb195X21lX2dhcywgcGF0aCA9ICJwcmVjaW9fZXhwb195X21kb19tdW5kaWFsX2dhcy54bHN4IikNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChjb21wYXJhY2lvbl9iZXAsIHBhdGggPSAiY29tcGFyYWNpb25fYmVwLnhsc3giKQ0KDQoNCmNvbXBhcmFjaW9uX3ByZWNpb3MgPC0gcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2V4dGVybm9fZ2FzKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9faW50ZXJub19nYXNfbW1idHVfdXNkICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2dhc19tZG9pbnQpKQ0KIA0KYGBgDQpidXNjYW1vcyB1biBwcmVjaW8NCg0KY3VhbnRvIGVzIHVuYSBjYW50aWRhZCBkZSBidHUgZGUgZ2FzIGFsIHByZWNpbyBkZSByZWZlcmVuY2lhIChlaiBib2xpdmlhKSB5IGN1YW50byBlcyBzaSBjb252aWVydG8gZXNvcyBidHUgYSBiYXJyaWxlcyB5IGxvcyB2YWxvcml6byBjb24gZWwgcHJlY2lvIGRlbCBiYXJyaWw/IGN1YW50byBxdWVkYSBsYSB1bmlkYWQgZW4gYnR1IHNpIHRvbW8gZWwgcHJlY2lvIGRlIHBldHJvbGVvIHkgbG8gY292aWVydG8gYSBidHUuIA0KZXMgZGVjaXIsIGN1YW50byBlcyBlbCB2YWxvciBzaSBsYSB2YWxvcml6byBlbiBwcmVjaW8gZGVsIHBldHJvbGVvDQoNCsK/Y3VhbnRvcyB1c2QgZXMgdW4gYnR1IGRlIHBldHJvbGVvPw0Kc2kgdG9tbyB1biBiYXJyaWwgZGUgcGV0cm9sZW8geSBsbyBjb252aWVydG8gYSBidHUgKCBtZSB2YSBhIGRhciBjdWFudG9zIFVTRCBlcyB1biBidHUpDQpsdWVnbyBjb21wYXJvIGxvcyBVU0QvYnR1IHkgbG8gY29tcGFybyBjb24gZWwgZ2FzIGRlIGJvbGl2aWENCg0KZ3JpbmJlcjogY29udmllcnRlIHRvZG8gZWwgZ2FzIGVuIHBldHJvbGVvIHkgbGUgcG9uZSBlbCBwcmVjaW8gZGUgcGV0cm9lbG9lLiBzdWJlc3RpbWEgbG9zIHByZWNpb3MgZGVsIGdhcz8NCg0KYGBge3J9DQpwcmVjaW9fY3J1ZG9fdnNfZ2FzIDwtIHByZWNpb19tZG9tdW5kaWFsX2dhc19iZXAgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZXh0ZXJub19nYXMpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoLXVuaWRhZCkgJT4lIA0KICAgICAgICAgICAgICBnYXRoZXIoa2V5ID0gdGlwb19wcmVjaW9fY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgID0gcHJlY2lvX2NydWRvX3VzZF9iYmwsDQogICAgICAgICAgICAgICAgICAgICAyOm5jb2woLikpLCBieSA9ImFuaW8iKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fY3J1ZG9fc29icmVfZ2FzID1wcmVjaW9fY3J1ZG9fdXNkX2JibC9wcmVjaW9fZXh0ZXJub19nYXMpICU+JSANCiAgZmlsdGVyKCEoaXMubmEocHJlY2lvX2NydWRvX3NvYnJlX2dhcykpLCANCiAgICAgICAgICEodGlwb19wcmVjaW9fY3J1ZG8gJWluJSBjKCJ3dGlfc3BvdF9wcmljZV9mcmVkIiwgInByZWNpb19tZV9jcnVkbyIpKSAgKQ0KICAgICAgICAgIyAodGlwb19wcmVjaW9fY3J1ZG8gJWluJSBjKCJicmVudF9pZWEiKSkgICkNCiAgICAgICAgICMgKHRpcG9fcHJlY2lvX2NydWRvICVpbiUgYygiYnJlbnRfaWVhIiwgImJyZW50X2hpc3RvcmljIikpICApDQpwcmVjaW9fY3J1ZG9fdnNfZ2FzDQoNCmdyYWYgPC0gIHByZWNpb19jcnVkb192c19nYXMgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHByZWNpb19jcnVkb19zb2JyZV9nYXMsIGNvbG9yPXRpcG9fcHJlY2lvX2NydWRvKSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gInByZWNpbyBkZWwgY3J1ZG8gc29icmUgZWwgZGVsIGdhcyAoYW1ib3MgZW4gYmFycmlsZXMpIikNCg0KZ2dwbG90bHkoZ3JhZiwgd2lkdGggPSA4MDAsIGxlbmd0aD02MDApDQojIGdyYWYNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb19jcnVkb192c19nYXMsIHBhdGg9ICJwcmVjaW8gZGVsIGNydWRvIHZzIGdhcy54bHN4IikgIA0KYGBgDQoNCg0KDQojIyBFeHBvcnRhY2lvbmVzIGUgSW1wb3J0YWNpb25lcw0KDQoqIEZ1ZW50ZXMNCiAgKyBbU0VTQ08gRG93bnN0cmVhbV0oaHR0cHM6Ly9kYXRvcy5nb2IuYXIvZGF0YXNldC9lbmVyZ2lhLXJlZmluYWNpb24tY29tZXJjaWFsaXphY2lvbi1wZXRyb2xlby1nYXMtZGVyaXZhZG9zLXRhYmxhcy1kaW5hbWljYXMpDQogICsgSU5ERUMNCiAgKyBNRUNPTg0KICArIFVOQ29tdHJhZGUNCg0KIyMjIyBFeHBvcnRhY2lvbmVzIGUgSW1wb3J0YWNpb25lcyBkZSBDcnVkbw0KKiBFeHBvcnRhY2lvbmVzIGRlIENydWRvOiANCiAgKyAxOTYyIGEgMTk5MzogVU4gQ29tdHJhZGUNCiAgKyAxOTk0IGVuIGFkZWxhbnRlOiBTRVNDTyBEb3duc3RyZWFtDQogICsgTG9zIGRhdG9zIGZhbHRhbnRlcyBkZSBTRVNDTyBzZSBjb21wbGV0YXJvbiBjb24gTUVDT04NCiAgKyBTaWd1ZW4gaGFiaWVuZG8gZGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIDE5NjUsIDE5NzAtNzQsIDE5NzYtNzgsIDE5ODAtODQNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMjIyBTRVNDTw0KI2NhbnRpZGFkZXMuIHBvc3QgMjAxMCAoaGFzdGEgMjAxOSkNCmltcG9ydGFjaW9uZXNfZXhwb3J0YWNpb25lcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9SZWZpbmFjacOzbiB5IGNvbWVyY2lhbGl6YWNpb24vaW1wb3J0YWNpb25lcy1leHBvcnRhY2lvbmVzLmNzdiIpDQoNCiMgY2FudGlkYWRlcy4gcG9zdCAyMDE2IA0KaW1wb3J0YWNpb25lc19leHBvcnRhY2lvbmVzX3Bvc3QyMDE2IDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1NFU0NPL1JlZmluYWNpw7NuIHkgY29tZXJjaWFsaXphY2lvbi9pbXBvcnRhY2lvbmVzLWV4cG9ydGFjaW9uZXMtYS1wYXJ0aXItZGVsLTIwMTYtLmNzdiIpDQoNCiMjIyNjb21lcmNpbyBleHRlcmlvciBwb3N0IDIwMTA6ICJURF9jb21lcmNpb19leHRlcmlvci54bHN4Ig0KY29tZXhfcG9zdDIwMTAgPC0gcmVhZF9kZWxpbSgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvY29tZXhfcG9zdDIwMTAuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFLCANCiAgICBza2lwID0gNSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gY2FzZV93aGVuKERhdG9zID09ICJTdW1hIGRlIG1vbnRvIiB+ICJVU0QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB1bmlkYWQpLA0KICAgICAgICAgCXVuaWRhZCA9IHN0cl9yZW1vdmVfYWxsKAl1bmlkYWQsICJbKCldIiApLA0KICAgICAgICAgZmVjaGEgPSBhcy5EYXRlKHBhcnNlX2RhdGVfdGltZShwYXN0ZTAoYW5pbywgbWVzKSwgb3JkZXJzID0gInltIikpKSAlPiUgIA0KICBmaWx0ZXIoIWlzLm5hKGFuaW8pKSAlPiUgDQogIHJlbmFtZShleHBvcnRhY2lvbiA9ICJFeHBvcnRhY2nDs24iLA0KICAgICAgICAgaW1wb3J0YWNpb24gPSAiSW1wb3J0YWNpw7NuIikgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGFuaW8sIG1lcywgZXZlcnl0aGluZyguKSwgLWMoIlRvdGFsIGdlbmVyYWwiLCBEYXRvcykpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICA2OjcpDQoNCiNvdHJhIGJhc2UuIHNvbG8gY2FudGlkYWRlcy4gdmVyIGRlIGRvbmRlIGFwYXJlY2nDsw0KaW1wb19leHBvIDwtIHJlYWRfY3N2KCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9pbXBvcnRhY2lvbmVzLWV4cG9ydGFjaW9uZXMgKDEpLmNzdiIpDQoNCg0KIyMjZXhwb3J0YWNpb25lcyBwcmUgMjAxMDogIkV4cG9ydGFjaW9uZXMueGxzeCINCmV4cG9fcHJlMjAxMCA8LSByZWFkX2RlbGltKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9leHBvX3ByZTIwMTAuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDsW8iLA0KICAgICAgICAgbWVzID0gIk1lcyIsDQogICAgICAgICBwcm9kdWN0byA9IFByb2R1Y3RvLA0KICAgICAgICAgdmFsb3IgPSBUb3RhbCkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IHpvbzo6bmEubG9jZihhbmlvKSwNCiAgICAgICAgIG1lcyA9IHpvbzo6bmEubG9jZihtZXMpLA0KICAgICAgICAgcHJvZHVjdG8gPSB6b286Om5hLmxvY2YocHJvZHVjdG8pLA0KICAgICAgICAgdmFyaWFibGUgPSAiZXhwb3J0YWNpb24iLA0KICAgICAgICAgZmVjaGEgPSBhcy5EYXRlKHBhcnNlX2RhdGVfdGltZShwYXN0ZTAoYW5pbywgbWVzKSwgb3JkZXJzID0gInltIikpLA0KICAgICAgICAgdW5pZGFkID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoRGF0b3MsICJNMyIpIH4gIm0zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KERhdG9zLCAiVG9uIikgfiAidG9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KERhdG9zLCAiRk9CIikgfiAiVVNEIikpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBldmVyeXRoaW5nKC4pLCAtYyhEYXRvcykpDQoNCiNubyBzZSBkZSBkb25kZSBzYWxpw7MgZXN0ZSBwZXJvIGhhYnJpYSBxIHJhc3RyZWFybG8NCmV4cG9fdXNkX3RvbiA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL2V4cG9fdXNkX3Rvbi5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUsIA0KICAgIHNraXAgPSAzKQ0KDQojIyNpbXBvcnRhY2lvbmVzIHByZSAyMDEwOiAiSW1wb3J0YWNpb25lcy54bHN4Ig0KaW1wb19wcmUyMDEwIDwtIHJlYWRfZGVsaW0oIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL2ltcG9fcHJlMjAxMC5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcOxbyIsDQogICAgICAgICBtZXMgPSAiTWVzIiwNCiAgICAgICAgIHByb2R1Y3RvID0gUHJvZHVjdG8sDQogICAgICAgICB2YWxvciA9IFRvdGFsKSAlPiUgDQogIG11dGF0ZShhbmlvID0gem9vOjpuYS5sb2NmKGFuaW8pLA0KICAgICAgICAgbWVzID0gem9vOjpuYS5sb2NmKG1lcyksDQogICAgICAgICBwcm9kdWN0byA9IHpvbzo6bmEubG9jZihwcm9kdWN0byksDQogICAgICAgICB2YXJpYWJsZSA9ICJpbXBvcnRhY2lvbiIsDQogICAgICAgICBmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBtZXMpLCBvcmRlcnMgPSAieW0iKSksDQogICAgICAgICB1bmlkYWQgPSBjYXNlX3doZW4oc3RyX2RldGVjdChEYXRvcywgIk0zIikgfiAibTMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoRGF0b3MsICJUb24iKSB+ICJ0b24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoRGF0b3MsICJGT0IiKSB+ICJVU0QiKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGV2ZXJ5dGhpbmcoLiksIC1jKERhdG9zKSkNCiMgaW1wb19wcmUyMDEwDQoNCg0KI0Jhc2UgdW5pZGEgZGUgU0VTQ08NCmNvbWVyY2lvX2V4dGVyaW9yIDwtIGNvbWV4X3Bvc3QyMDEwICU+JSANCiAgYmluZF9yb3dzKGltcG9fcHJlMjAxMCwgZXhwb19wcmUyMDEwKSAlPiUgDQogIGFycmFuZ2UoZmVjaGEpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gY2FzZV93aGVuKHVuaWRhZCA9PSAibWlsZXMvbTMiIH4gdmFsb3IgKiAxMDAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHZhbG9yKSwNCiAgICAgICAgIHVuaWRhZCA9IGNhc2Vfd2hlbih1bmlkYWQgPT0gIm1pbGVzL20zIiB+ICJtMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHVuaWRhZCkpDQoNCiNleHBvIGUgaW1wbyBkZSBDcnVkby4gY2FudGlkYWRlcyB5IHZhbG9yDQpjb21leF9jcnVkb19zZXNjbyA8LSBjb21lcmNpb19leHRlcmlvciAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiUEVUUk9MRU8iKSB8IHN0cl9kZXRlY3QocHJvZHVjdG8sICJDdWVuY2EiKSwNCiAgICAgICAgIHVuaWRhZCAhPSAiVG9uIikgJT4lIA0KICBncm91cF9ieShhbmlvLCB2YXJpYWJsZSwgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZSh2YWxvciA9IHN1bSh2YWxvciwgbmEucm0gPSBUKSkgJT4lIA0KICBtdXRhdGUocHJvZHVjdG8gPSAiY3J1ZG8iLA0KICAgICAgICAgdmFsb3IgPSBjYXNlX3doZW4odW5pZGFkID09ICJtMyIgfiBjb252ZXJzb3JfbTNiYmxfcSh2YWxvciksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdmFsb3IpLA0KICAgICAgICAgdW5pZGFkID0gY2FzZV93aGVuKHVuaWRhZCA9PSAibTMiIH4gImJhcnJpbGVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdW5pZGFkKSkNCg0KDQojcXXDqSBwcm9kdWN0b3MgZW50cmFuIGVuIGVsIGZpbHRybyBkZSBjcnVkbz8NCiMgdW5pcXVlKChjb21lcmNpb19leHRlcmlvciAlPiUgZmlsdGVyKHN0cl9kZXRlY3QocHJvZHVjdG8sICJQRVRST0xFTyIpIHwgc3RyX2RldGVjdChwcm9kdWN0bywgIkN1ZW5jYSIpKSkkcHJvZHVjdG8pDQoNCg0KI01FQ09ODQpjb21leF9oaWRyb2NhcmJ1cm9zX21lY29uIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVjb24vYmFzZS1taW5lcmlhLWUtaGlkcm9jYXJidXJvcyBjdWVudGFzIG5hY2lvbmFsZXMueGxzIiwgDQogICAgc2hlZXQgPSAiQ29tLiBleHRlcmlvciIsIHNraXAgPSA3KSAlPiUNCiAgcmVuYW1lKGFuaW8gPSAnLi4uMScgLA0KICAgICAgICAgZXhwb19NbTNfY3J1ZG8gPSAnRXhwb3J0YWNpb25lcy4uLjInLA0KICAgICAgICAgaW1wb19NbTNfY3J1ZG8gPSAnSW1wb3J0YWNpb25lcy4uLjMnLA0KICAgICAgICAgc2FsZG9fTW0zX2NydWRvID0gYEJhbGFuY2UgKFgtTSkuLi40YCwNCiAgICAgICAgIGV4cG9fTU1tM19nYXMgPSAnRXhwb3J0YWNpb25lcy4uLjUnLA0KICAgICAgICAgaW1wb19NbTNfZ2FzID0gJ0ltcG9ydGFjaW9uZXMuLi42JywNCiAgICAgICAgIHNhbGRvX01tM19nYXMgPSBgQmFsYW5jZSAoWC1NKS4uLjdgLA0KICAgICAgICAgZXhwb19tZXRhbGlmZXJvc19vdHJvc19NTXVzZCA9IGBNaW5lcmFsZXMgbWV0YWzDrWZlcm9zLCBlc2NvcmlhcyB5IGNlbml6YXNgLA0KICAgICAgICAgZXhwb19jcnVkb19NTXVzZCA9IGBQZXRyw7NsZW8gY3J1ZG9gLA0KICAgICAgICAgZXhwb19nYXNfTU11c2QgPSBgR2FzIGRlIHBldHLDs2xlbyB5IG90cm9zIGhpZHJvY2FyYnVyb3NgLA0KICAgICAgICAgZXhwb19jYXJidXJhbnRlc19vdHJvc19NTXVzZCA9IGBDYXJidXJhbnRlcywgZ3Jhc2FzIHkgYWNlaXRlcyBsdWJyaWNhbnRlc2AsDQogICAgICAgICBleHBvX2VsZWN0cmljYV9NTXVzZCA9IGBFbmVyZ8OtYSBlbMOpY3RyaWNhYCwNCiAgICAgICAgIGV4cG9fcmVzdG9fY29tYnVzdGlibGVzX01NdXNkID0gYFJlc3RvIGRlIGNvbWJ1c3RpYmxlc2ApICU+JSANCiAgZmlsdGVyKCFpcy5uYShhbmlvICkpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpICU+JSANCiAgbXV0YXRlKGV4cG9fYmJsX2NydWRvID0gY29udmVyc29yX20zYmJsX3EoZXhwb19NbTNfY3J1ZG8qMTAwMCksDQogICAgICAgICBpbXBvX2JibF9jcnVkbyA9IGNvbnZlcnNvcl9tM2JibF9xKGltcG9fTW0zX2NydWRvKjEwMDApLA0KICAgICAgICAgc2FsZG9fYmJsX2NydWRvID0gY29udmVyc29yX20zYmJsX3Eoc2FsZG9fTW0zX2NydWRvKjEwMDApKQ0KDQoNCiNJTkRFQyAtIENvbUV4DQojY2FudGlkYWRlcw0KY2FudGlkYWRlc19leHBvX2hpZHJvX2luZGVjIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9JTkRFQy9Db21FeC9jYW50aWRhZGVzX2V4cG9faGlkcm9faW5kZWMuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSAlPiUgDQogIHJlbmFtZShleHBvX2luZGVjX2NydWRvID0gcGV0cm9sZW9fY3J1ZG9fZXhwbywNCiAgICAgICAgICAgZXhwb19pbmRlY19nYXMgID0gZ2FzX25hdHVyYWxfZXhwbykNCg0KI3ZhbG9yDQpleHBvX2hpZHJvX3ZhbG9yX2luZGVjIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9JTkRFQy9Db21FeC9leHBvX2hpZHJvX3ZhbG9yLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lIA0KICByZW5hbWUoZXhwb19pbmRlY19jcnVkbyA9IHBldHJvbGVvX2NydWRvX2V4cG8sDQogICAgICAgICAgIGV4cG9faW5kZWNfZ2FzICA9IGdhc19uYXR1cmFsX2V4cG8pDQoNCg0KDQojTWVyZ2UgZGUgYmFzZXMNCiNDcnVkbyBleHBvIGNhbnRpZGFkDQpleHBvX3FfY3J1ZG8gPC0gY29tZXhfY3J1ZG9fc2VzY28gJT4lDQogIGZpbHRlcih2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iLA0KICAgICAgICAgdW5pZGFkID09ICJiYXJyaWxlcyIpICU+JQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCB2YWxvcikgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICByZW5hbWUoZXhwb19zZXNjb19jcnVkbyA9IHZhbG9yKSAlPiUgDQogIGxlZnRfam9pbihjb21leF9oaWRyb2NhcmJ1cm9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fbWVjb25fY3J1ZG8gPSBleHBvX2JibF9jcnVkbykpICU+JSANCiAgbGVmdF9qb2luKGNhbnRpZGFkZXNfZXhwb19oaWRyb19pbmRlYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtZXhwb19pbmRlY19nYXMpKSAlPiUgDQogIGZ1bGxfam9pbihleHBvX2NydWRvX3NpdGMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX2NhbnRpZGFkLCBleHBvX2NvbXRyYWRlX2NydWRvID0gZXhwb19iYmwgKSkgJT4lIA0KICBtdXRhdGUoZXhwb19jcnVkbyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5NCB8IGFuaW8gPT0gMTk5OSB+IGV4cG9fY29tdHJhZGVfY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoZXhwb19zZXNjb19jcnVkbykgfiBleHBvX21lY29uX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZXhwb19zZXNjb19jcnVkbyksDQogICAgICAgICB1bmlkYWQgPSAiYmFycmlsZXMiLA0KICAgICAgICAgZGlmID0gZXhwb19jcnVkby9leHBvX2luZGVjX2NydWRvIC0gMSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLGV4cG9fY3J1ZG8sIGV2ZXJ5dGhpbmcoLiksIC12YXJpYWJsZSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQoNCg0KIyBNZXJnZSBjcnVkbyBVU0QNCmV4cG9fdXNkX2NydWRvIDwtIGNvbWV4X2NydWRvX3Nlc2NvICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIgLCB1bmlkYWQgPT0gIlVTRCIpICU+JSANCiAgcmVuYW1lKGV4cG9fY3J1ZG9fc2VzY28gPSB2YWxvcikgJT4lDQogIGxlZnRfam9pbihjb21leF9oaWRyb2NhcmJ1cm9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fY3J1ZG9fbWVjb24gPSBleHBvX2NydWRvX01NdXNkKSkgJT4lIA0KICBsZWZ0X2pvaW4oZXhwb19oaWRyb192YWxvcl9pbmRlYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2luZGVjX2NydWRvKSkgJT4lIA0KICBmdWxsX2pvaW4oZXhwb19jcnVkb19zaXRjICU+JSANCiAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfdmFsb3IsIGV4cG9fY29tdHJhZGVfY3J1ZG8gPSBleHBvX3VzZF9jb210cmFkZV9jcnVkbykpICU+JQ0KICBtdXRhdGUoZXhwb19jcnVkb19tZWNvbiA9IGV4cG9fY3J1ZG9fbWVjb24gKjEwMDAwMDAsDQogICAgICAgICBleHBvX2NydWRvID0gY2FzZV93aGVuKGFuaW8gPDE5OTQgfiBleHBvX2NvbXRyYWRlX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID49IDE5OTQgfiBleHBvX2NydWRvX3Nlc2NvKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBleHBvX2NydWRvLCBldmVyeXRoaW5nKC4pLCAtYyh2YXJpYWJsZSwgcHJvZHVjdG8pKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eC8xMF42fSkNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QodXNkID0gZXhwb191c2RfY3J1ZG8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICMgY2FudGlkYWRlcyA9IGV4cG9fcV9jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAjIHByZWNpb19leHBvcnRhY2lvbl95X3JlZmVyZW5jaWEgPSBwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvKSwgDQogICAgICAgICAgICAgICAgICAgICMgcGF0aCA9ICJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL3Jlc3VsdGFkb3MvZXhwb19jcnVkby54bHN4IikNCg0KZXhwb19xX2NydWRvDQpleHBvX3VzZF9jcnVkbw0KYGBgDQoNCg0KIyMjIyBFeHBvcnRhY2lvbmVzIGUgSW1wb3J0YWNpb25lcyBkZSBHYXMNCiogRnVlbnRlcyBzZWxlY2Npb25hZGFzOg0KICsgMTk2MiBhIDE5OTY6IFVOIENvbXRyYWRlLA0KICsgMTk5NyBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICsgRGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIDE5OTkgeSAyMDAwDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojU0VTQ08NCmNvbWV4X2dhcyA8LSBjb21lcmNpb19leHRlcmlvciAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiR0FTIE5BVFVSQUwiKSB8IHN0cl9kZXRlY3QocHJvZHVjdG8sICJHYXMgTmF0dXJhbCIpIA0KICAgICAgICAgfCBzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiR2FzIGRlIFJlZmluZXLDrWEiKSwNCiAgICAgICAgIHByb2R1Y3RvICE9ICJHYXMgTmF0dXJhbCBMaWN1YWRvIiwNCiAgICAgICAgIHVuaWRhZCAhPSAiVG9uIikgJT4lDQogIGdyb3VwX2J5KGFuaW8sIHZhcmlhYmxlLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKHZhbG9yID0gc3VtKHZhbG9yLCBuYS5ybSA9IFQpKSU+JSANCiAgbXV0YXRlKHByb2R1Y3RvID0gImdhcyIpDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KGNvbWV4X2NydWRvX3Nlc2NvICU+JSBmaWx0ZXIodW5pZGFkID09ICJVU0QiLCB2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWV4X2NydWRvX3Nlc2NvICU+JSBmaWx0ZXIodW5pZGFkID09ICJVU0QiLCB2YXJpYWJsZSA9PSAiaW1wb3J0YWNpb24iKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWV4X2dhcyAlPiUgZmlsdGVyKHVuaWRhZCA9PSAiVVNEIiwgdmFyaWFibGUgPT0gImltcG9ydGFjaW9uIiksDQojICAgICAgICAgICAgICAgICAgICAgICAgICBjb21leF9nYXMgJT4lIGZpbHRlcih1bmlkYWQgPT0gIlVTRCIsIHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIpKSwgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJjb21leF9zZXNjby54bHN4IikNCg0KI0V4cG8gZ2FzIFNFU0NPIGNhbnRpZGFkZXMNCmV4cG9fc2VzY29fcV9nYXMgPC0gY29tZXhfZ2FzICAlPiUNCiAgZmlsdGVyKHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIsDQogICAgICAgICB1bmlkYWQgPT0gIm0zIikgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoLWModmFyaWFibGUsIHByb2R1Y3RvKSkgJT4lDQogIHJlbmFtZShleHBvX3Nlc2NvX2dhcyA9IHZhbG9yKSAlPiUNCiAgbXV0YXRlKGV4cG9fc2VzY29fZ2FzID0gcmVwbGFjZV9uYShleHBvX3Nlc2NvX2dhcywgMCApLA0KICAgICAgICAgZXhwb19zZXNjb19nYXMgPSBleHBvX3Nlc2NvX2dhcyAvIDEwMDAsDQogICAgICAgICB1bmlkYWQgPSAiTWlsZXMgZGUgbTMiKQ0KDQojZXhwbyBzZXNjbyBnYXMgdmFsb3INCmV4cG9fc2VzY29fdXNkX2dhcyA8LSBjb21leF9nYXMgICU+JQ0KICBmaWx0ZXIodmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIiwNCiAgICAgICAgIHVuaWRhZCA9PSAiVVNEIikgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoLWModmFyaWFibGUsIHByb2R1Y3RvKSkgJT4lDQogIHJlbmFtZShleHBvX3Nlc2NvX2dhcyA9IHZhbG9yKSAlPiUNCiAgbXV0YXRlKGV4cG9fc2VzY29fZ2FzID0gcmVwbGFjZV9uYShleHBvX3Nlc2NvX2dhcywgMCApKQ0KDQoNCiNleHBvIFVOIENvbXRyYWRlDQpleHBvX2dhc19zaXRjIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9VTiBDb210cmFkZS9yZXN1bHRhZG9zL2V4cG9fZ2FzX3NpdGMuY3N2IikgICU+JSANCiAgcmVuYW1lKHRyYWRlX3ZhbHVlX3VzZCA9ICJUcmFkZSBWYWx1ZSAoVVMkKSIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QiLA0KICAgICAgICAgZXhwb19NbTMgPSBleHBvX01tMyAvMTAwMCwNCiAgICAgICAgIHVuaWRhZF9jYW50aWRhZCA9ICAiTWlsZXMgZGUgbTMiKQ0KDQoNCiNNZXJnZSBjYW50aWRhZGVzDQpleHBvX3FfZ2FzIDwtICBleHBvX3Nlc2NvX3FfZ2FzICU+JSANCiAgbGVmdF9qb2luKGNvbWV4X2hpZHJvY2FyYnVyb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19nYXNfbWVjb24gPSBleHBvX01NbTNfZ2FzKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIsDQogICAgICAgICAgICAgICAgICAgICBleHBvX2dhc19tZWNvbiA9IGV4cG9fZ2FzX21lY29uICogMTAwMCkgKSAlPiUgDQogIGxlZnRfam9pbihjYW50aWRhZGVzX2V4cG9faGlkcm9faW5kZWMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoLWV4cG9faW5kZWNfY3J1ZG8pKSAlPiUgDQogIGZ1bGxfam9pbihleHBvX2dhc19zaXRjICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19nYXNfY29tdHJhZGUgPSBleHBvX01tMywgdW5pZGFkID0gdW5pZGFkX2NhbnRpZGFkICkpICU+JSANCiAgIyBtdXRhdGUoZGlmID0gZXhwb19zZXNjb19nYXMvIGV4cG9faW5kZWNfZ2FzIC0gMSApICU+JQ0KICBtdXRhdGUoZXhwb19nYXMgPSBjYXNlX3doZW4oYW5pbyA8IDE5OTcgfiBleHBvX2dhc19jb210cmFkZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDE5OTYgfmV4cG9fc2VzY29fZ2FzICkpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4cG9fZ2FzLCBldmVyeXRoaW5nKC4pKQ0KDQpleHBvX3FfZ2FzX01NQlRVIDwtIGV4cG9fcV9nYXMgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHNlbGVjdCgtYyh1bmlkYWQpKSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge2NvbnZlcnNvcl9tM01NQlRVX3EoeCoxMDAwKX0gKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTU1CVFUiKQ0KDQojTWVyZ2UgdmFsb3INCmV4cG9fdXNkX2dhcyA8LSBleHBvX3Nlc2NvX3VzZF9nYXMgJT4lDQogIGxlZnRfam9pbihjb21leF9oaWRyb2NhcmJ1cm9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fZ2FzX21lY29uID0gZXhwb19nYXNfTU11c2QpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGV4cG9fZ2FzX21lY29uID0gZXhwb19nYXNfbWVjb24gKiAxMDAwMDAwKSkgICU+JSANCiAgbGVmdF9qb2luKGV4cG9faGlkcm9fdmFsb3JfaW5kZWMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19nYXNfaW5kZWMgPSBleHBvX2luZGVjX2dhcykpICU+JSANCiAgZnVsbF9qb2luKGV4cG9fZ2FzX3NpdGMgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2dhc19jb210cmFkZSA9IHRyYWRlX3ZhbHVlX3VzZCwgdW5pZGFkICkpICU+JSANCiAgIyBtdXRhdGUoZGlmID0gZXhwb19zZXNjb19nYXMvZXhwb19nYXNfaW5kZWMgLTEpICU+JSANCiAgbXV0YXRlKGV4cG9fZ2FzID0gY2FzZV93aGVuKGFuaW8gPCAxOTk3IH4gZXhwb19nYXNfY29tdHJhZGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk5NyB+IGV4cG9fc2VzY29fZ2FzKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBleHBvX2dhcywgZXZlcnl0aGluZyguKSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQogIA0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdCggY2FudGlkYWRlcyA9IGV4cG9fcV9nYXMsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRCA9IGV4cG9fdXNkX2dhcywgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4cG9feV9yZWZlcmVuY2lhID0gcHJlY2lvX2V4cG9feV9tZV9nYXMpLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9leHBvX2dhcy54bHN4IikNCg0KIyBjb21leF9jcnVkb19zZXNjbyAlPiUgZmlsdGVyKHVuaWRhZCA9PSAibTMiLCB2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iKQ0KIyBjb21leF9nYXMgJT4lIGZpbHRlcih1bmlkYWQgPT0gIm0zIiwgdmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIikNCmV4cG9fcV9nYXMgDQpleHBvX3VzZF9nYXMNCmBgYA0KDQojIyBFbXBsZW8sIFJlbXVuZXJhY2lvbmVzIHkgTWFzYSBTYWxhcmlhbCAoQ0NOTikNCg0KKiBTYWxhcmlvIHkgZW1wbGVvDQogICsgTVRFeVNTIChCYXNlIE1pbmVyw61hIGUgSGlkcm9jYXJidXJvcyBkZSBsYXMgQ3VlbnRhcyBOYWNpb25hbGVzKSAoMTk5Ni0yMDEzKQ0KICArIFtNaW5pc3RlcmlvIGRlIFRyYWJham8sIEVtcGxlbyB5IFNlZ3VyaWRhZCBTb2NpYWwgLSBPYnNlcnZhdG9yaW8gZGUgRW1wbGVvIHkgRGluw6FtaWNhIEVtcHJlc2FyaWFsIChPRURFKV0oaHR0cDovL3d3dy50cmFiYWpvLmdvYi5hci9lc3RhZGlzdGljYXMvb2VkZS9lc3RhZGlzdGljYXNuYWNpb25hbGVzLmFzcCkgKDE5OTYtMjAxOSkNCiAgKyBFUEggPz8NCjxicj4NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNhbnVhcmlvcyBDRVBBTA0KY2VwYWxfMTk5MSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0NFUEFML2NlcGFsXzE5OTEueGxzeCIpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgLyBjb252ZXJzb3JfcGVzb3MkQSAvMTBeMywNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIikNCg0KbWFzYV9zYWxhcmlhbF9jZXBhbCA8LSBjZXBhbF8xOTkxICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJyZW11bmVyYWNpb25fYWxfdHJhYmFqbyIpICU+JSANCiAgcmVuYW1lKG1zX2NlcGFsID0gdmFsb3IpDQogIA0KDQojY29uIGRhdG9zIGRlIGxhIGJhc2UgZGUgQ0NOTg0KZW1wbGVvIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVjb24vYmFzZS1taW5lcmlhLWUtaGlkcm9jYXJidXJvcyBjdWVudGFzIG5hY2lvbmFsZXMueGxzIiwgDQogICAgc2hlZXQgPSAiRW1wbGVvIHJlZ2lzdHJhZG8iLCBza2lwID0gNSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgICBwZXJpb2RvID0iUGVyw61vZG8iLA0KICAgICAgICAgZW1wbGVvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyA9ICIuLi43IiwNCiAgICAgICAgZW1wbGVvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zID0gIi4uLjgiICkgJT4lDQogICBmaWx0ZXIoaXMubmEocGVyaW9kbyksICFpcy5uYShhbmlvKSApICU+JQ0KICBzZWxlY3QoYW5pbywgZW1wbGVvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyxlbXBsZW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfZW1wbGVvID0gIlB1ZXN0b3MgZGUgdHJhYmFqbyIsDQogICAgICAgICBlbXBsZW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gYXMuZG91YmxlKGVtcGxlb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MpLA0KICAgICAgICAgZW1wbGVvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zID0gYXMuZG91YmxlKGVtcGxlb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcykpIA0KICANCg0Kc2FsYXJpb3MgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9iYXNlLW1pbmVyaWEtZS1oaWRyb2NhcmJ1cm9zIGN1ZW50YXMgbmFjaW9uYWxlcy54bHMiLCANCiAgICBzaGVldCA9ICJSZW11bmVyYWNpb25lcyIsIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiLCANCiAgICAgICAgImRhdGUiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiksIHNraXAgPSA1KSAlPiUgDQogICAgcmVuYW1lKGFuaW8gPSAiQcOxbyIsDQogICAgICAgICAgcGVyaW9kbyA9IlBlcsOtb2RvIiwNCiAgICAgICAgICBzYWxhcmlvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyA9ICIuLi43IiwNCiAgICAgICAgIHNhbGFyaW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgPSAgIi4uLjgiKSAlPiUgDQogIGZpbHRlcighaXMubmEoYW5pbykgJiBhbmlvIDwgMjAxNCkgJT4lIA0KICBzZWxlY3QoYW5pbywgc2FsYXJpb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3Msc2FsYXJpb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyApICU+JSANCiAgbXV0YXRlKHVuaWRhZF9zYWxhcmlvID0gIlBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgc2FsYXJpb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3M9IGFzLmRvdWJsZShzYWxhcmlvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyksDQogICAgICAgIHNhbGFyaW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgPSBhcy5kb3VibGUoc2FsYXJpb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcykpDQogICANCm1hc2Ffc2FsYXJpYWxfY2NubiA8LSBlbXBsZW8gJT4lIA0KICBsZWZ0X2pvaW4oc2FsYXJpb3MsIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfbWFzYV9zYWxhcmlhbCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiA9IChzYWxhcmlvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyAqZW1wbGVvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyoxMykvMTBeNiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfc2VydmljaW9zID0gKHNhbGFyaW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgKmVtcGxlb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyoxMykvMTBeNiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfdG90YWwgPSBtYXNhX3NhbGFyaWFsX2V4dHJhY2Npb24gKyBtYXNhX3NhbGFyaWFsX3NlcnZpY2lvcykgDQoNCg0KDQojY29uIGRhdG9zIGRlIGVtcGxlbyByZWdpc3RyYWRvIA0KcmVtdW5lcmFjaW9uZXNfYW51YWwgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NaW5pc3RlcmlvIFRyYWJham8vbmFjaW9uYWxfc2VyaWVfcmVtdW5lcmFjaW9uZXNfYW51YWwueGxzeCIsIA0KICAgIHNoZWV0ID0gIkMgNSIsIGNvbF90eXBlcyA9IGMoInNraXAiLCANCiAgICAgICAgInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiksIHNraXAgPSA0KSAlPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lDQogIHJlbmFtZShyYW1hX2FjdGl2aWRhZCA9ICJSYW1hIGRlIGFjdGl2aWRhZCIpICU+JSANCiAgZmlsdGVyKCBzdHJfZGV0ZWN0KHJhbWFfYWN0aXZpZGFkLCAicGV0csOzbGVvIikpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9zYWxhcmlvID0gIlBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgcmFtYV9hY3RpdmlkYWQ9IA0KICAgICAgICAgICBjYXNlX3doZW4ocmFtYV9hY3RpdmlkYWQ9PQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3RpdmlkYWRlcyAgZGUgc2VydmljaW9zIHJlbGFjaW9uYWRhcyBjb24gbGEgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzLCBleGNlcHRvIGxhcyBhY3RpdmlkYWRlcyBkZSBwcm9zcGVjY2nDs24iIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbXVuZXJhY2lvbl9zZXJ2aWNpb3NfZXh0cmFjY2lvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbWFfYWN0aXZpZGFkPT0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvIHkgZ2FzIG5hdHVyYWwiIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbXVuZXJhY2lvbl9leHRyYWNjaW9uX3BldHJvbGVvX2dhcyIpKSAlPiUgDQogICAgZmlsdGVyKCEoaXMubmEocmFtYV9hY3RpdmlkYWQpKSkgJT4lIA0KICBzcHJlYWQoa2V5ID0gcmFtYV9hY3RpdmlkYWQsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yKQ0KICANCg0KDQplbXBsZW9fYW51YWwgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NaW5pc3RlcmlvIFRyYWJham8vbmFjaW9uYWxfc2VyaWVfZW1wbGVvX2FudWFsLnhsc3giLCANCiAgICBzaGVldCA9ICJDIDUiLCBjb2xfdHlwZXMgPSBjKCJza2lwIiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIpLCANCiAgICBza2lwID0gNCklPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lDQogIHJlbmFtZShyYW1hX2FjdGl2aWRhZCA9ICJSYW1hIGRlIGFjdGl2aWRhZCIpICU+JSANCiAgZmlsdGVyKCBzdHJfZGV0ZWN0KHJhbWFfYWN0aXZpZGFkLCAicGV0csOzbGVvIikpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gYXMuZG91YmxlKHZhbG9yKSwNCiAgICAgICAgIHVuaWRhZF9lbXBsZW8gPSAiUHVlc3RvcyBkZSB0cmFiYWpvIiwNCiAgICAgICAgIHJhbWFfYWN0aXZpZGFkPSBjYXNlX3doZW4ocmFtYV9hY3RpdmlkYWQ9PQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3RpdmlkYWRlcyAgZGUgc2VydmljaW9zIHJlbGFjaW9uYWRhcyBjb24gbGEgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzLCBleGNlcHRvIGxhcyBhY3RpdmlkYWRlcyBkZSBwcm9zcGVjY2nDs24iIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVtcGxlb19zZXJ2aWNpb3NfZXh0cmFjY2lvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbWFfYWN0aXZpZGFkPT0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvIHkgZ2FzIG5hdHVyYWwiIH4gImVtcGxlb19leHRyYWNjaW9uX3BldHJvbGVvX2dhcyIpKSAlPiUgDQogIGZpbHRlcighKGlzLm5hKHJhbWFfYWN0aXZpZGFkKSkpICU+JSANCiAgc3ByZWFkKGtleSA9IHJhbWFfYWN0aXZpZGFkLA0KICAgICAgICAgdmFsdWUgPSB2YWxvcikNCg0KbWFzYV9zYWxhcmlhbF9vZWRlIDwtIGVtcGxlb19hbnVhbCAlPiUgDQogIGxlZnRfam9pbihyZW11bmVyYWNpb25lc19hbnVhbCwgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9tYXNhX3NhbGFyaWFsID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uID0gKCAgcmVtdW5lcmFjaW9uX2V4dHJhY2Npb25fcGV0cm9sZW9fZ2FzICplbXBsZW9fZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMqMTMpLzEwXjYsDQogICAgICAgICBtYXNhX3NhbGFyaWFsX3NlcnZpY2lvcyA9IChyZW11bmVyYWNpb25fc2VydmljaW9zX2V4dHJhY2Npb24gKmVtcGxlb19zZXJ2aWNpb3NfZXh0cmFjY2lvbioxMykvMTBeNiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfdG90YWwgPSBtYXNhX3NhbGFyaWFsX3NlcnZpY2lvcyArIG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiwNCiAgICAgICAgIGFuaW8gPWFzLmRvdWJsZShhbmlvKSkNCg0KbWFzYV9zYWxhcmlhbF9oaWRyb2NhcmJ1cm9zIDwtIG1hc2Ffc2FsYXJpYWxfY2NubiAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfbWFzYV9zYWxhcmlhbCwgbWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uX2Njbm49IG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiwgDQogICAgICAgICBtYXNhX3NhbGFyaWFsX3RvdGFsX2Njbm4gPSBtYXNhX3NhbGFyaWFsX3RvdGFsKSAlPiUgDQogIGZ1bGxfam9pbihtYXNhX3NhbGFyaWFsX29lZGUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX21hc2Ffc2FsYXJpYWwsIA0KICAgICAgICAgICAgICAgICAgICAgbWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uX29lZGU9IG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiwNCiAgICAgICAgICAgICAgICAgICAgIG1hc2Ffc2FsYXJpYWxfdG90YWxfb2VkZSA9bWFzYV9zYWxhcmlhbF90b3RhbCkpICU+JSANCiAgZnVsbF9qb2luKG1hc2Ffc2FsYXJpYWxfY2VwYWwgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBtc19jZXBhbCkpICU+JSANCiAgIyBtdXRhdGUobXMgPSBjYXNlX3doZW4oYW5pbyA8IDE5OTYgfiBtc19jZXBhbCwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+PSAxOTk2IH5tYXNhX3NhbGFyaWFsX29lZGUpKSAlPiUgDQogIGFycmFuZ2UoYW5pbykNCm1hc2Ffc2FsYXJpYWxfaGlkcm9jYXJidXJvcyAgDQoNCg0KYGBgDQoNCg0KDQojIyBQb3pvcw0KDQoNCiMjIyBNZXRyb3MgcGVyZm9yYWRvcw0KDQpGdWVudGU6DQoNCiogW1NlY3JldGFyw61hIGRlIEVuZXJnw61hXShodHRwczovL2RhdG9zLmdvYi5hci9kYXRhc2V0L2VuZXJnaWEtcGVyZm9yYWNpb24tcG96b3MtcGV0cm9sZW8tZ2FzKQ0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQptZXRyb3NfcGVyZm9yYWRvc19wb3N0ZXJpb3JfYWxfMjAwOSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9zZWNyZXRhcmlhIGRlIGVuZXJnaWEvbWV0cm9zLXBlcmZvcmFkb3MuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhpbmRpY2VfdGllbXBvID0gY29sX2RhdGUoZm9ybWF0ID0gIiVZLSVtIikpKQ0KDQptZXRyb3NfcGVyZm9yYWRvc19hbnRlcmlvcl9hbF8yMDA5IDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL3NlY3JldGFyaWEgZGUgZW5lcmdpYS9tZXRyb3MtcGVyZm9yYWRvcy1hbnRlcmlvci1hbC0yMDA5LmNzdiIpICU+JSANCiAgcmVuYW1lKGNhbnRpZGFkID0gQ2FudGlkYWQpDQoNCm1ldHJvc19wZXJmb3JhZG9zX2VtcHJlc2EgPC0gbWV0cm9zX3BlcmZvcmFkb3NfcG9zdGVyaW9yX2FsXzIwMDkgJT4lDQogIGJpbmRfcm93cyhtZXRyb3NfcGVyZm9yYWRvc19hbnRlcmlvcl9hbF8yMDA5KSAlPiUgDQogIHNlbGVjdChhbmlvLCBtZXMsIGlkZW1wcmVzYSwgZW1wcmVzYSwgaWRjb25jZXB0bywgY29uY2VwdG8sIGNhbnRpZGFkLCBvYnNlcnZhY2lvbmVzICkgJT4lIA0KICBncm91cF9ieShhbmlvLCBpZGVtcHJlc2EsIGVtcHJlc2EpICU+JQ0KICBzdW1tYXJpc2UobWV0cm9zX3BlcmZvcmFkb3MgPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JSANCiAgdW5ncm91cCgpDQogIA0KDQptZXRyb3NfcGVyZm9yYWRvcyA8LSBtZXRyb3NfcGVyZm9yYWRvc19lbXByZXNhICU+JQ0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShtZXRyb3NfcGVyZm9yYWRvcyA9IHN1bShtZXRyb3NfcGVyZm9yYWRvcywgbmEucm0gPSBUKSkgJT4lDQogIG11dGF0ZShpbmRpY2VfbWV0cm9zID0gZ2VuZXJhcl9pbmRpY2Uoc2VyaWU9IG1ldHJvc19wZXJmb3JhZG9zLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYSA9IGFuaW8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDAxKSkgDQoNCmdyYWZfbWV0cm9zX3BlcmZvcmFkb3MgPC0gbWV0cm9zX3BlcmZvcmFkb3NfZW1wcmVzYSU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCBtZXRyb3NfcGVyZm9yYWRvcywgZmlsbCA9IGVtcHJlc2EpKSArDQogIGdlb21fY29sKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKw0KICBsYWJzKHRpdGxlID0gIk1ldHJvcyBwZXJmb3JhZG9zIHBvciBlbXByZXNhIikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKQ0KZ2dwbG90bHkoZ3JhZl9tZXRyb3NfcGVyZm9yYWRvcywgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCg0KDQojbGlzdGFkbyBkZSBlbXByZXNhcyBjb24gc3VzIGlkJ3MNCmxpc3RhZG9fZW1wcmVzYSA8LSBkaXN0aW5jdChtZXRyb3NfcGVyZm9yYWRvc19lbXByZXNhICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGlkZW1wcmVzYSwgZW1wcmVzYSksaWRlbXByZXNhLCAua2VlcF9hbGwgPSBUKSANCiAgDQoNCg0KYGBgDQoNCg0KDQojIyMgUG96b3MgZW4gb3BlcmFjacOzbg0KDQpGdWVudGVzOg0KDQoqIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIC0gW0RhdG9zIE1JTkVNXShodHRwczovL2dpdGh1Yi5jb20vZGF0b3NtaW5lbS9wcm9kdWNjaW9uLWRlLXBldHJvbGVvLXktZ2FzLXBvci1wb3pvKToNCiAgKyBbTGlzdGFkbyBkZSBwb3pvcyBjYXJnYWRvcyBwb3IgZW1wcmVzYXMgb3BlcmFkb3Jhc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3Byb2R1Y2Npb24tZGUtcGV0cm9sZW8teS1nYXMtcG9yLXBvem8vYXJjaGl2by9jYmZhNGQ3OS1mZmIzLTQwOTYtYmFiNS1lYjBkZGU5YTgzODUpOiBzZSB0b21hIGxhIHZhcmlhYmxlICJGZWNoYSBkZWwgRmluIGRlIHRlcm1pbmFjacOzbiBkZSBwZXJmb3JhY2nDs24gZGVsIHBvem8iIChhZGppdl9mZWNoYV9maW5fdGVybSkgY29tbyBhw7FvIGRlIHB1ZXN0YSBlbiBwcm9kdWNjacOzbiBkZWwgcG96by4gU2UgcG9kcsOtYSBlbGFib3JhciB1biBzdG9jayBkZSBwb3pvcyBhIHBhcnRpciBkZSBhY3VtdWxhciBsb3MgcG96b3MgdGVybWluYWRvcyB5IHJlc3RhbmRvIGxvcyBwb3pvcyBhYmFuZG9uYWRvcywgYWdydXBhbmRvIGNvbiBsYSB2YXJpYWJsZSAiRmVjaGEgZGUgYWJhbmRvbm8gZGVsIHBvem8iKGFkaml2X2ZlY2hhX2FiYW5kb25vKQ0KICArIFtQb3pvcyB0ZXJtaW5hZG9zXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvcGVyZm9yYWNpb24tZGUtcG96b3MtZGUtcGV0cm9sZW8teS1nYXMvYXJjaGl2by9hMmNlMTRhZi01YzU2LTQ1YzItOWI5Yy1jN2ExZTUxNTZkZmYpDQogICsgW0NhcMOtdHVsbyBJVl0oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3Byb2R1Y2Npb24tZGUtcGV0cm9sZW8teS1nYXMtcG9yLXBvem8vYXJjaGl2by9jYjVjMGYwNC03ODM1LTQ1Y2QtYjk4Mi0zZTI1Y2E3ZDc3NTEpDQogICsgW0VzdGFkbyBkZSBwb3pvc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L2VzdGFkby1kZS1wb3pvcy1kZS1wZXRyb2xlby15LWdhcykgKEFVTiBOTyBTRSBQUk9DRVPDkyBFU1RBIEJBU0UgTkkgTEEgQU5URVJJT1IpIA0KICArIFtTRVNDT10oaHR0cDovL3d3dy5lbmVyZ2lhLmdvYi5hci9jb250ZW5pZG9zL3ZlcnBhZ2luYS5waHA/aWRwYWdpbmE9MTYyNCkNCiogW0lBUEddKGh0dHBzOi8vd3d3LmlhcGcub3JnLmFyL3dlYl9pYXBnL3NlY3RvcmVzL2VzdGFkaXN0aWNhcy9wcm9kdWN0b3MvbGlzdGFkb3MvbGlzdGFkb190b2Rvc19sb3NfcHJvZHVjdG9zLmh0bSkuIFNlIHByZXNlbnRhbiBkb3Mgc2VyaWVzOiB1bmEgZWxhYm9yYWRhIGEgcGFydGlyIGRlIGxvcyBwb3pvcyBwZXJmb3JhZG9zIHBvciBhw7FvIChyZXN1bHRhbnRlIGRlIGRlc2NhcmdhciB1bmEgYmFzZSBwb3IgY2FkYSBhw7FvIGRlbCBzaXRpbyB3ZWIgb2ZpY2lhbCkgeSBvdHJhIHF1ZSBjb3JyZXNwb25kZSBhbCBzdG9jayBkZSBwb3pvcyBkZSBwZXRyw7NsZW8gZGUgZXh0cmFjY2nDs24gZWZlY3RpdmEgKHByb2NlZGVudGUgZGUgbG9zIGRhdG9zIGRlIEVzdGFkw61zdGljYXMgZGVsIENlbnRlbmFyaW8gZGUgSUFQRykuDQoNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBtZWNobz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQojIHNlYyBlbmVyZ2lhDQojIHBvem9zIGNhcmdhZG9zIHBvciBlbXByZXNhcw0KbGlzdGFkb19wb3pvcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9jYXBpdHVsbyBpdi9saXN0YWRvLWRlLXBvem9zLWNhcmdhZG9zLXBvci1lbXByZXNhcy1vcGVyYWRvcmFzLmNzdiIpICU+JSANCiAgbXV0YXRlKGFuaW9fdGVybWluYWNpb25fcG96byA9eWVhcihhZGppdl9mZWNoYV9maW5fdGVybSkpICU+JQ0KICBsZWZ0X2pvaW4obGlzdGFkb19lbXByZXNhKSAlPiUgDQogIGdyb3VwX2J5KGFuaW9fdGVybWluYWNpb25fcG96bywgaWRlbXByZXNhLCBlbXByZXNhKSAlPiUgDQogIHN1bW1hcmlzZShwb3pvcyA9IG4oKSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGFuaW9fdGVybWluYWNpb25fcG96bykpDQoNCg0KICAjIG11dGF0ZShlbXByZXNhID0gY2FzZV93aGVuKGlkZW1wcmVzYSA9PSAiWVBGIiB+ICJZUEYiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJQQUUiIH4gIlBBRSIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIllTVVIiIH4gIllTVVIiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJQTFUiIH4gIlBsdXNwZXRyb2wiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJQTFVFIiB+ICJQbHVzcGV0cm9sIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiVklTIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIlRQVCIgfiAiVGVjcGV0cm9sIiwgDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIkNHQyIgfiAiQ0dDIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiV0lOIiB+ICJXaW50ZXJzaGFsbCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIlRBVSIgfiAiVG90YWwgQXVzdHJhbCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIllTVVIiIH4gIllTVVIiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJTSEUiIH4gIlNoZWxsIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiQ0FQIiB+ICJDYXBleCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIlBQQU0iIH4gIlBhbXBhIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiAiT3RyYSIpKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiUEVUUk9CUkFTIEFSR0VOVElOQSBTLkEuIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWRlbXByZXNhID09ICJQRVNBIChQRVRST0JSQVMgRS5TLkEuKSIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiRU5BUCBTSVBFVFJPTCBBUkdFTlRJTkEgUy5BLiIgfiAiRU5BUCBTSVBFVFJPTCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZGVtcHJlc2EgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0EiIH4gIlZpc3RhIE9pbCBhbmQgR2FzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiU0lOT1BFQyBBUkdFTlRJTkEgRVhQTE9SQVRJT04gQU5EIFBST0RVQ1RJT04sIElOQy4iIH4gIlNpbm9wZWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWRlbXByZXNhID09ICJQTFVTUEVUUk9MIEVORVJHWSBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiWVNVUiBQRVRST0xFUkEgQVJHRU5USU5BIFMuQS4iIH4gIllTVVIiKSkNCg0KZ3JhZl9wb3pvc19zZWNfZW5lcmdpYSA8LSBsaXN0YWRvX3Bvem9zICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvX3Rlcm1pbmFjaW9uX3Bvem8sIHBvem9zLCBmaWxsID0gZW1wcmVzYSkpKw0KICBnZW9tX2NvbCgpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgbGFicyh0aXRsZSA9ICJQb3pvcyBjYXJnYWRvcyBwb3IgZW1wcmVzYXMgb3BlcmFkb3JhcyAocG9yIGHDsW8gZGUgdGVybWluYWNpw7NuKSIsDQogICAgICAgY2FwdGlvbiA9ICJTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSIpDQpnZ3Bsb3RseShncmFmX3Bvem9zX3NlY19lbmVyZ2lhLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiAgDQpwb3pvc190ZXJtaW5hZG9zX2FudGVyaW9yX2FsXzIwMDkgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3Mvc2VjcmV0YXJpYSBkZSBlbmVyZ2lhL3Bvem9zLXRlcm1pbmFkb3MtYW50ZXJpb3ItYWwtMjAwOS5jc3YiKSAlPiUgDQogIHJlbmFtZShjYW50aWRhZCA9IENhbnRpZGFkKQ0KDQpwb3pvc190ZXJtaW5hZG9zIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL3NlY3JldGFyaWEgZGUgZW5lcmdpYS9wb3pvcy10ZXJtaW5hZG9zLmNzdiIpICU+JSANCiAgYmluZF9yb3dzKHBvem9zX3Rlcm1pbmFkb3NfYW50ZXJpb3JfYWxfMjAwOSkgJT4lIA0KICBncm91cF9ieShhbmlvLCBpZGVtcHJlc2EsIGVtcHJlc2EgKSAlPiUgDQogIHN1bW1hcmlzZShwb3pvcyAgPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpDQoNCg0KZ3JhZl9wb3pvc190ZXJtaW5hZG9zIDwtIHBvem9zX3Rlcm1pbmFkb3MgJT4lDQogIGdncGxvdChhZXMoYW5pbywgcG96b3MgLCBmaWxsID0gZW1wcmVzYSkpKw0KICBnZW9tX2NvbCgpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgbGFicyh0aXRsZSA9ICJDYW50aWRhZCBkZSBwb3pvcyB0ZXJtaW5hZG9zIiwNCiAgICAgICBjYXB0aW9uID0gIlNlY3JldGFyw61hIGRlIEVuZXJnw61hIikNCmdncGxvdGx5KGdyYWZfcG96b3NfdGVybWluYWRvcywgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojcG96b3MgaWFwZyAoYmFzZXMgYW51YWxlcykNCnBvem9faWFwZ18wNSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMDUueGxzIiwgDQogICAgc2tpcCA9IDEpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDA1KSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMDYgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDA2LnhscyIsIA0KICAgIHNraXAgPSAxKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAwNikgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzA3IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAwNy54bHMiLCANCiAgICBza2lwID0gMSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMDcpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18wOCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMDgueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDA4KSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMDkgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDA5LnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAwOSkgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzEwIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxMC54bHMiLCANCiAgICBza2lwID0gMikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTApICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18xMiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTIueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDEyKSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMTMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDEzLnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxMykgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzE0IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxNC54bHMiLCANCiAgICBza2lwID0gMikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTQpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18xNSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTUueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDE1KSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMTYgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDE2LnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxNikNCg0KcG96b19pYXBnXzE3IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxNy54bHMiLCANCiAgICBza2lwID0gMikgICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDE3KQ0KDQpwb3pvX2lhcGdfMTggPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDE4LnhscyIsIA0KICAgIHNraXAgPSAyKSAgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTgpDQoNCnBvem9faWFwZ18xOSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTkueGxzIiwgDQogICAgc2tpcCA9IDIpICAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxOSkgJT4lIA0KICByZW5hbWUoIlRvdGFsIFBvem9zIiA9ICJUb3RhbCBQb3pvcyBUZXJtaW5hZG9zIikNCg0KI3NlIG1lIGNvbGFyb24gYWxndW5hcyBmaWxhcyBkZSB0b3RhbGVzIHF1ZSBoYXkgcXVlIGJvcnJhcg0KcG96b3NfaWFwZyA8LSBwb3pvX2lhcGdfMDUgJT4lIA0KICBiaW5kX3Jvd3MocG96b19pYXBnXzA2LCBwb3pvX2lhcGdfMDcsIHBvem9faWFwZ18wOCwgcG96b19pYXBnXzA5LCANCiAgICAgICAgICAgIHBvem9faWFwZ18xMCwgcG96b19pYXBnXzEyLCBwb3pvX2lhcGdfMTMsIHBvem9faWFwZ18xNCwgcG96b19pYXBnXzE1LA0KICAgICAgICAgICAgcG96b19pYXBnXzE2LCBwb3pvX2lhcGdfMTcsIHBvem9faWFwZ18xOCwgcG96b19pYXBnXzE5KSAlPiUNCiAgcmVuYW1lKHRvdGFsX3Bvem9zID0gICJUb3RhbCBQb3pvcyIpICU+JSANCiAgZmlsdGVyKCEoT3BlcmFkb3IgJWluJSBjKCJUb3RhbGVzIiwgIlRPVEFMIikpICYgIShpcy5uYShPcGVyYWRvcikpICkgJT4lIA0KICBtdXRhdGUoZW1wcmVzYSA9Y2FzZV93aGVuKE9wZXJhZG9yID09ICJZUEYgUy5BLiIgfiAiWVBGIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiUEFOIEFNRVJJQ0FOIEVORVJHWSAoU1VDVVJTQUwgQVJHRU5USU5BKSBMTEMiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgU0wiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlBBTiBBTUVSSUNBTiIgfiAiUEFFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiUEVUUk9CUkFTIEFSR0VOVElOQSBTLkEuIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJQRVNBIChQRVRST0JSQVMgRS5TLkEuKSIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiVEVDUEVUUk9MIFMuQS4iIH4gIlRlY3BldHJvbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlBMVVNQRVRST0wgUy5BLiIgfiAiUGx1c3BldHJvbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlNJTk9QRUMgQVJHRU5USU5BIEVYUExPUkFUSU9OIElOQyIgfiAiU2lub3BlYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIkNPTVBBw5HDjUEgR0VORVJBTCBERSBDT01CVVNUSUJMRVMgUy5BLiIgfiAiQ0dDIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJWSVNUQSBPSUwgJiBHQVMgQVJHRU5USU5BIFNBVSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJXSU5URVJTSEFMTCBFTkVSR0lBIFMuQS4iIH4gIldpbnRlcnNoYWxsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiRU5BUCBTSVBFVFJPTCBBUkdFTlRJTkEgUy5BLiIgfiAiRU5BUCBTSVBFVFJPTCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIllTVVIgRU5FUkfDjUEgQVJHRU5USU5BIFMuUi5MLiIgfiAiWVNVUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIllTVVIgUEVUUk9MRVJBIEFSR0VOVElOQSBTLkEiIH4gIllTVVIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJUT1RBTCBBVVNUUkFMIFMuQS4iIH4gIlRvdGFsIEF1c3RyYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBPcGVyYWRvcikpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGVtcHJlc2EpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdChlbXByZXNhLCBhbmlvLHRvdGFsX3Bvem9zKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIGVtcHJlc2EpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX3Bvem9zID0gc3VtKHRvdGFsX3Bvem9zKSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQpwb3pvc19pYXBnDQoNCmdyYWZfcG96b3NfaWFwZyA8LSBwb3pvc19pYXBnICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB0b3RhbF9wb3pvcywgZmlsbCA9IGVtcHJlc2EpKSsNCiAgZ2VvbV9jb2woKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIGxhYnModGl0bGUgPSAiUG96b3MgcGVyZm9yYWRvcyIsDQogICAgICAgY2FwdGlvbiA9ICJJQVBHIikNCmdncGxvdGx5KGdyYWZfcG96b3NfaWFwZywgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojcG96b3MgaWFwZyBhY3VtdWxhZG9zDQpwb3pvc19pYXBnX2NlbnRlbmFyaW8gPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL3Bvem9zX2lhcGdfY2VudGVuYXJpby5jc3YiLCAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JSANCiAgcmVuYW1lKHRvdGFsZXMgPSB0b3RhbGUpDQoNCmdyYWZfcG96b3NfaWFwZ19jZW50ZW5hcmlvIDwtIHBvem9zX2lhcGdfY2VudGVuYXJpbyAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdG90YWxlcykpKw0KICBnZW9tX2NvbCgpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgbGFicyh0aXRsZSA9ICJQb3pvcyBlbiBleHRyYWNjacOzbiBkZWZpbml0aXZhIiwNCiAgICAgICBjYXB0aW9uID0gIklBUEciKQ0KZ2dwbG90bHkoZ3JhZl9wb3pvc19pYXBnX2NlbnRlbmFyaW8sIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCg0KIyBjb21wYXJhY2lvbiBkZSBmdWVudGVzDQpjb21wYXJhY2lvbl9wb3pvcyA8LSBwb3pvc19pYXBnICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UocG96b3NfcGVyZm9yYWRvc19pYXBnID0gc3VtKHRvdGFsX3Bvem9zLCBuYS5ybSA9IFQpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocG96b3NfdGVybWluYWRvcyAlPiUNCiAgICAgICAgICAgICAgIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgICAgICAgICAgICAgIHN1bW1hcmlzZShwb3pvc190ZXJtaW5hZG9zX3NlY19lbmVyZ2lhID0gc3VtKHBvem9zLCBuYS5ybSA9IFQpKSkgJT4lIA0KICByaWdodF9qb2luKGxpc3RhZG9fcG96b3MgJT4lIA0KICAgICAgICAgICAgICAgIHJlbmFtZShhbmlvID0gYW5pb190ZXJtaW5hY2lvbl9wb3pvKSAlPiUgDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZShwb3pvc19jYXJnYWRvc19zZWNfZW5lcmdpYSA9IHN1bShwb3pvcywgbmEucm0gPSBUKSkpICU+JSANCiAgZnVsbF9qb2luKHBvem9zX2lhcGdfY2VudGVuYXJpbyAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZSh2YXJpYWNpb25fcG96b3MgPSB2YXJpYWNpb25faW50ZXJhbnVhbCh0b3RhbGVzKSkgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwb3pvc192YXJpYWNpb25faWFwZyA9IHZhcmlhY2lvbl9wb3pvcykpIA0KDQoNCmdyYWZfcG96b3MgPC0gY29tcGFyYWNpb25fcG96b3MgJT4lDQogIGdhdGhlcihrZXkgPSAiZnVlbnRlIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGZ1ZW50ZSkpKw0KICBnZW9tX2xpbmUoKSsNCiAgIyBnZW9tX3BvaW50KCkrDQogIHlsaW0oMCwgMTcwMCApKw0KICBsYWJzKHRpdGxlID0gIlBvem9zLiBDb21wYXJhY2nDs24gZGUgZnVlbnRlcyIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCmdncGxvdGx5KGdyYWZfcG96b3MsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KDQp2ZXIgcmVsYWNpb25lcw0KKiBQQkkgaGlkcm9jYXJidXJvcyAvIFBCSSB0b3RhbCAodmVyIGN1YWwgZWxlZ2lyKQ0KKiBjb3JyZWdpciBudWVzdHJvIFZCUCBkZXB1cmFuZG8gc2VydmljaW9zDQoqIE1JUCdzIGNvZWYgdGVjbmljbyAocGFyYSB2ZXIgQ0kgZW4gZWwgc2VjdG9yIHBldHJvbGVybyB5IHBlc28gZGVsIHNlY3RvciBwZXRyb2xlcm8gZW4gUEJJKQ0KDQoqIHN0b2NrIHBldHJvbGVybyAvIHN0b2NrIHRvdGFsIEpJQyxFTSANCiogU3RvY2sgZXh0cmFjY2lvbiA9IFBQeUUgUEFFICsgUFB5RSBUZWNwICsgUFB5RSBQZXRyb2JyYXMgdXBzdHIgKyBBY3Rpdm8gWVBGIHVwc3RyZWFtDQogICogdmVyIHF1ZSBwb3JjZW50YWplIHF1ZSByZXByZXNlbnRhbiBlc3RhcyBlbXByZXNhcyBlbiBsYSBwcm9kdWNjaW9uIG8gcG96b3MgeSB2ZXIgZGUgYW1wbGlhcmxvIA0KICAqIHZlciByZWxhY2lvbiBBY3Rpdm8gWVBGIHVwc3RyZWFtIC8gUFB5RSBpbnRlZ3JhZGEgWVBGDQogICogdmVyIHJlbGFjaW9uIGdhbmFuY2lhcyBBRklQIHkgQk9MU0FSIGNvbiBlbCBzdG9jayBjb3JyZXNwb25kaWVudGUgKGNvaGVyZW5jaWEpIA0KICAqIHZlciByZWxhY2lvbiBjb24gQ29yZW1iZXJnDQogICogcGFzYXIgRU5HRSANCg0KKmdyaW5iZXJnDQogICogY29udmVydGlyIGxvIG51ZXN0cm8gYSBjb3N0b3MuIGFnYXJyYXIgbnVlc3Ryb3MgdmFsb3IgeSBkaXZpZGlybG8gcG9yIGJhcnJpbGVzIChzdW1hbmRvIGdhcyBlbiBCT0UpDQogICogY29zdG9zIHBvciBiYmwsIHByZWNpbyBlbCBiYXJyaWwgeSBwcmVjaW8gZGUgcHJvZHVjY2lvbiAoc3VtbyBsYSBnY2lhIG5vcm1hbCBhbCBjb3N0bzEpDQoNCg0KIyMgQWN0aXZvcw0KDQpQYXNhciBkYXRvcyBkZSBicyBkZSB1c28gZW4geWFjaW1pZW50b3MgcGFyYSBhcm1hciByZWxhY2nDs24gYWN0aXZvIHlhY2ltZWludG8vdG90YWwNCg0KRnVlbnRlczoNCg0KKiBCYWxhbmNlcyBkZSBCb2xzYXIgKHVuaWNhbWVudGUgZW1wcmVzYXMgcXVlIGNvdGl6YW4gZW4gbGEgYm9sc2EgZGUgdmFsb3JlcyBhcmdlbnRpbmEpLiBSZXZpc2FyIGVsIHN0b2NrIGRlbCBzZWN0b3IgZGlzdHJpYnVjacOzbiBwb3JxdWUgc2UgcHJlc2VudGEgZGVtYXNpYWRvIGdyYW5kZSBjb24gcmVzcGVjdG8gYWwgZGUgbG9zIGRlbcOhcy4gRmFsdGEgcGFzYXIgbG9zIGRhdG9zIGRlbCBhY3Rpdm8gZGUgY2FzaSB0b2RhcyBsYXMgZW1wcmVzYXMNCiogQUZJUC4gQ29uIGVzdGEgZnVlbnRlIG5vIHRlbmVtb3MgY2FsY3VsbyBkZSByZW50YSwgc2lubyBxdWUgc29sbyB1c2Ftb3MgbGEgVEcgY29tbyBwYXLDoW1ldHJvLiBOb3RhOiAiX2MiIHNpZ25pZmljYSBjYXNvcyBwcmVzZW50YWRvcyBkZSBsYSB2YXJpYWJsZSBjb3JyZXNwb25kaWVudGUNCiogTWVtb3JpYXMgZGUgWVBGLiBMYSBkw6ljYWRhIGRlIGxvcyA4MCBwcmVzZW50YSBwaWNvcyBxdWUgaGF5IHF1ZSByZXZpc2FyDQoNCg0KKiBDYWxjdWxvIGRlbCBDYXBpdGFsIFRvdGFsIEFkZWxhbnRhZG8gKEtUQSkgDQoNCiAgKyBCb2xzYXI6IEVzIGVxdWl2YWxlbnRlIGEgbGEgc3VtYSBkZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwb3MgTmV0YSAoZGVzY29udGFuZG8gbG9zIHRlcnJlbm9zIHkgb2JyYXMgZW4gY3Vyc28pIHkgbG9zIEludmVudGFyaW9zLiBDdWFuZG8gbG9zIGRhdG9zIGxvIGhhYmlsaXRhbiwgc2UgbGUgYWdyZWfDsyBsb3Mgc2FsYXJpb3MgYWRlbGFudGFkb3MgKHNhbGFyaW9zIHkgY2FyZ2FzIGNvbnN1bWlkb3Mgc29icmUgcm90YWNpw7NuKS4gTHVlZ28sIGN1YW5kbyBubyBzZSBwcmVzZW50YXJvbiBkYXRvcyBkZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwb3MsIHNlIHRvbcOzIGVsIGFjdGl2byBubyBjb3JyaWVudGUuDQogICsgQUZJUDogRXMgZXF1aXZhbGVudGUgYSBsYSBzdW1hIGRlIEJpZW5lcyBkZSBVc28sIEJpZW5lcyBkZSBDYW1iaW8sIEludmVudGFyaW9zIHkgRGlzcG9uaWJpbGlkYWRlcy4NCiAgKyBNZW1vcmlhIFlQRjogU3VtYSBkZSBCaWVuZXMgZGUgVXNvIHkgQmllbmVzIGRlIENhbWJpbw0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgQk9MU0FSDQoNCiNzZWdtZW50b3MgZGUgWVBGIHkgUGV0cm9icmFzDQp5cGZfc2VnIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IveXBmX3NlZ21lbnRvcy5jc3YiLCANCiAgICAiLCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JSANCiAgc2VsZWN0KC1YMSkgJT4lIA0KICBtdXRhdGUoc2VjdG9yID0gY2FzZV93aGVuKCBzZWN0b3IgPT0gICJxdWltaWNhIiB+ICJwZXRyb3F1aW1pY2EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gc2VjdG9yKSwNCiAgICAgICAgIGFuaW8gPSB5ZWFyKGZlY2hhKSkNCg0KcGV0cm9icmFzX2FyX3NlZyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3BldHJvYnJhc19hcmdfc2VnbWVudG9zLmNzdiIsIA0KICAgICIsIiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSklPiUgDQogIHNlbGVjdCgtWDEpDQoNCnVuaW9uX3NlZ21lbnRvcyA8LSB5cGZfc2VnICU+JSANCiAgc2VsZWN0KGFuaW8sIGVtcHJlc2Esc2VjdG9yLCB1bmlkYWQsIGFjdGl2byA9IGFjdGl2b3MpICU+JSANCiAgYmluZF9yb3dzKHBldHJvYnJhc19hcl9zZWcgJT4lIA0KICAgICAgICAgICAgICByZW5hbWUoYW5pbyA9IGZlY2hhKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvICwgZW1wcmVzYSwgdW5pZGFkLCBzZWN0b3IsIHByb3BfcGxhbnRhX2VxdWlwbyA9IHBweWUsIGFjdGl2byA9IGFjdGl2b3MpKSAlPiUgDQogIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICA1Om5jb2woLikpICU+JQ0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPXZhbG9yL2lwY18xOCwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IikgJT4lIA0KICBzZWxlY3QoLWlwY18xOCkNCg0Kc3RvY2tfc2VnbWVudG9zIDwtIHVuaW9uX3NlZ21lbnRvcyAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHNlY3RvciwgdmFyaWFibGUgLHVuaWRhZCApICU+JSANCiAgc3VtbWFyaXNlKHZhbG9yID0gc3VtKHZhbG9yLCBuYS5ybSA9IFQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShmdWVudGUgPSAiQWN0aXZvIGRlIFlQRiB5IFBldHJvYnJhcyIsDQogICAgICAgICB2YXJpYWJsZV9zZWN0b3IgPSBwYXN0ZSh2YXJpYWJsZSwgc2VjdG9yLCBzZXAgPSAiICIpKQ0KDQoNCiMjIFN0b2NrIHBvciBlbXByZXNhcw0Kc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcmVzdWx0YWRvcy9iYWxhbmNlc19hcmcuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSAlPiUgDQogIGZpbHRlciggIShlbXByZXNhICVpbiUgYygiY2hldnJvbl9nbG9iYWwiLCAicGV0cm9icmFzX2dsb2JhbCIgKSkpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IiwNCiAgICAgICAgIGFuaW8gPSB5ZWFyKGZlY2hhKSwNCiAgICAgICAgIGZ1ZW50ZSA9ICJCb2xzYXIiKSAlPiUNCiAgc2VsZWN0KGFuaW8sZnVlbnRlLCBldmVyeXRoaW5nKC4pLCAtYyhmZWNoYSwgcGFpcywgdGdfYW50LCB0Z19kZXNwLCByb3RhY2lvbikpICU+JSANCiAgIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICA2Om5jb2woLikpICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgL2lwY18xOCwNCiAgICAgICAgIGVtcHJlc2EgPSBjYXNlX3doZW4oZW1wcmVzYSA9PSAicGV0cm9icmFzX2FyIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJ0ZWNwZXRyb2wiIH4gIlRlY3BldHJvbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gImNhbXV6emlfcGFtcCIgfiAiQ2FtdXp6aSBHYXMgUGFtcGVhbmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJtZXRyb2dhcyIgfiAiTWV0cm9nYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZW1wcmVzYSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgZW1wcmVzYSxmdWVudGUsIHNlY3RvciwgdW5pZGFkLCB2YXJpYWJsZSkgJT4lDQogIHN1bW1hcmlzZSh2YWxvciA9IHN1bSh2YWxvciwgbmEucm0gPSBUKSkgJT4lDQogIGZpbHRlcih2YXJpYWJsZSAlaW4lIGMoIktUQSIsICJwcHllIiwgInBweWVfbmV0YSIgLCAiaW52ZW50YXJpb3MiLCAiYWN0aXZvX25vX2NvcnIiLCAiYWN0aXZvIikpDQogICAgDQoNCg0KIyMgU3RvY2sgcG9yIHJhbWENCnN0b2NrX2JhbGFuY2VzX3JhbWEgPC0gIHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBiaW5kX3Jvd3Moc3RvY2tfc2VnbWVudG9zICU+JSANCiAgICAgICAgICAgICAgIyBmaWx0ZXIoc2VjdG9yID09ICJ1cHN0cmVhbSIgJiB2YXJpYWJsZSA9PSAiYWN0aXZvIikgJT4lDQogICAgICAgICAgICAgIGZpbHRlcih2YXJpYWJsZV9zZWN0b3IgPT0gImFjdGl2byB1cHN0cmVhbSIpICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoLXZhcmlhYmxlX3NlY3RvcikgJT4lDQogICAgICAgICAgICAgIG11dGF0ZShzZWN0b3IgPSBjYXNlX3doZW4oc2VjdG9yID09ICJ1cHN0cmVhbSIgfiAicHJvZHVjY2lvbiIpLA0KICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgPSAgY2FzZV93aGVuKHZhcmlhYmxlID09ICJhY3Rpdm8iIH4gInBweWUiKSwNCiAgICAgICAgICAgICAgICAgICAgIGZ1ZW50ZSA9ICJCb2xzYXIiLA0KICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9IllQRiB5IFBldHJvYnJhcyIpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHNlY3Rvcix2YXJpYWJsZSwgdW5pZGFkLCBmdWVudGUpICU+JQ0KICBzdW1tYXJpc2UodmFsb3IgPSBzdW0odmFsb3IsIG5hLnJtID0gVCkpICANCiAgDQogICMgc3ByZWFkKGtleSA9IHNlY3RvciwNCiAgIyAgICAgICAgdmFsdWUgPSBLVEEpICU+JSANCiAgIyBtdXRhdGUoaW50ZWdyYWRhX3lfZXh0cmFjY2lvbiA9IGludGVncmFkYSArIHByb2R1Y2Npb24sDQogICMgICAgICAgIHZhcmlhYmxlID0gIktUQSIpICU+JSANCiAgIyByZW5hbWUoZXh0cmFjY2lvbiA9IHByb2R1Y2Npb24pICU+JSANCiAgIyBzZWxlY3QoYW5pbywgdmFyaWFibGUsIG1vbmVkYSwgZXZlcnl0aGluZyguKSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgVGFzYXMgZGUgZGVwcmVjaWFjaW9uDQojQUZJUA0KdGFzYV9kZXByZWNpYWNpb25fYWZpcCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9BRklQL2djaWFfdjgueGxzeCIsIA0KICAgIHNraXAgPSA0KSAlPiUNCiAgc2VsZWN0KC1jKDQ5Om5jb2woLikpKSAlPiUgDQogIGdyb3VwX2J5KCByYW1hLCB5ZWFyKSAlPiUgDQogIHN1bW1hcmlzZSh0YXNhX2RlcHJlY2lhY2lvbiA9IGRlcHJlY2lhY2lvbmJzdXNvL2JzdXNvKQ0KI0JhbGFuY2VzDQpyZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL2JhbGFuY2VzX2FyZy5jc3YiLCANCiAgICAgICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lDQogICAgZmlsdGVyKGVtcHJlc2EgPT0gIllQRiIpICU+JSANCiAgICBncm91cF9ieShlbXByZXNhKSAlPiUgDQogICAgbXV0YXRlKHRhc2FfZGVwcmVjaWFjaW9uID0gZGVwcmVjaWFjaW9uZXMvcHB5ZSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGVtcHJlc2EsIHRhc2FfZGVwcmVjaWFjaW9uKQ0KDQoNCiMjI0FGSVANCiMgU3RvY2sgZGUgYmFsYW5jZXMgLSAgQUZJUA0KZGF0b3NfYWZpcCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9BRklQL2djaWFfdjgueGxzeCIsIA0KICAgIHNraXAgPSA0KSAlPiUNCiAgc2VsZWN0KC1jKDQ5Om5jb2woLikpKSAgJT4lIA0KICByZW5hbWUoYW5pbyA9IHllYXIsDQogICAgICAgICBpZHNlY3RvciA9IGlkcmFtYSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gInBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgc2VjdG9yID0gY2FzZV93aGVuKCByYW1hID09ICJwZXRybyIgfiAiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtYSA9PSAic2VyX3BldHJvIiB+ICJzZXJ2aWNpb3NfcGV0cm9sZXJvcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcmFtYSkpJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBpZHNlY3Rvciwgc2VjdG9yLCBldmVyeXRoaW5nKC4pLCAtcmFtYSkNCmRhdG9zX2FmaXANCg0KDQpzdG9ja19hZmlwIDwtIGRhdG9zX2FmaXAgJT4lIA0KICBncm91cF9ieShhbmlvLCBpZHNlY3Rvciwgc2VjdG9yLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKEtUQSA9IGRpc3BvbmliaWxpZGFkZXMgKyBic2NhbWJpbyArIGludmVudGFyaW9zICsgYnN1c28sDQogICAgICAgICAgICBwcHllID0gc3VtKGJzdXNvLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgYWN0aXZvID0gc3VtKGFjdGl2bywgbmEucm0gPSBUKSkgJT4lDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiAgbXV0YXRlKEtUQSA9IChLVEEvMTBeNikgLyBpcGNfMTgsDQogICAgICAgICBwcHllPSAocHB5ZS8xMF42KSAvIGlwY18xOCwNCiAgICAgICAgIGFjdGl2bz0gKGFjdGl2by8xMF42KSAvIGlwY18xOCwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IikgJT4lIA0KICBhcnJhbmdlKGlkc2VjdG9yKSAlPiUgDQogIGZpbHRlcihzZWN0b3IgJWluJSBjKCJleHRyYWNjaW9uX3BldHJvbGVvX2dhcyIsICJzZXJ2aWNpb3NfcGV0cm9sZXJvcyIpKSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KC1jKGlkc2VjdG9yLCBpcGNfMTgpKSAlPiUgDQogIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICA0Om5jb2woLikpICU+JSANCiAgbXV0YXRlKGZ1ZW50ZSA9ICJBRklQIikNCnN0b2NrX2FmaXANCg0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgDQojIE1lbW9yaWFzIFlQRiANCmJhbGFuY2VfeXBmIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXhjZWxzIGRlIEJldGFuaWEvQ2FsY3Vsb3MgQmV0YW5pYSBUZy54bHMiLCANCiAgICBzaGVldCA9ICJZUEZfQSAkSE9ZX1BBUkFERUZMQUNZQ0FMQ1VMQVIiLCANCiAgICBza2lwID0gMSkgJT4lIA0KICBzZWxlY3QoLWMoMTI6bmNvbCguKSkpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcOxbyIsDQogICAgICAgICB1bmlkYWQgPSBtb25lZGEsDQogICAgICAgICB2ZW50YXMgPSAiVmVudGFzLi4uMyIsDQogICAgICAgICBjb3N0b192ZW50YXMgPSAiQ29zdG8gZGUgbGFzIFZlbnRhcy4uLjQiLA0KICAgICAgICAgdXRpbGlkYWRfbmV0YSA9ICJVdGlsaWRhZCBuZXRhIiwNCiAgICAgICAgIHV0aWxpZGFkX29wZXJhdGl2YSA9ICJVdGlsaWRhZCBvcGVyYXRpdmEiLA0KICAgICAgICAgcHB5ZSA9ICJCcyBVc28iLA0KICAgICAgICAgYmllbmVzX2RlX2NhbWJpbyA9ICJCcyBDYW1iaW8iLA0KICAgICAgICAgdXRpbGlkYWRfbmV0YV9hbnRlc19pbXB1ZXN0b3MgPSAiVU4gYW50ZXMgZGUgaW1wdWVzdG9zIChnwrQgYWN0aXZvcyB5IGRpdmlkZW5kb3MpIiwNCiAgICAgICAgIGFjdGl2byA9ICJBY3Rpdm8gVG90YWwiLA0KICAgICAgICAgcGF0cmltb25pb19uZXRvID0gIlBhdHJpbW9uaW8gTmV0byIpICU+JQ0KICBmaWx0ZXIoIShpcy5uYShhbmlvKSkpICU+JQ0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JQ0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHt4IC8gMTBeNn0pICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgIGRlIDIwMTgiLA0KICAgICAgICAgdmVudGFzID12ZW50YXMvaXBjXzE4LA0KICAgICAgICAgY29zdG9fdmVudGFzID0gY29zdG9fdmVudGFzL2lwY18xOCwNCiAgICAgICAgIHV0aWxpZGFkX25ldGEgPSB1dGlsaWRhZF9uZXRhL2lwY18xOCwNCiAgICAgICAgIHV0aWxpZGFkX29wZXJhdGl2YSA9IHV0aWxpZGFkX29wZXJhdGl2YS9pcGNfMTgsDQogICAgICAgICBwcHllID0gcHB5ZS9pcGNfMTgsDQogICAgICAgICBiaWVuZXNfZGVfY2FtYmlvID0gYmllbmVzX2RlX2NhbWJpby9pcGNfMTgsDQogICAgICAgICB1dGlsaWRhZF9uZXRhX2FudGVzX2ltcHVlc3RvcyA9IHV0aWxpZGFkX25ldGFfYW50ZXNfaW1wdWVzdG9zL2lwY18xOCwNCiAgICAgICAgIGFjdGl2byA9IGFjdGl2by9pcGNfMTgsDQogICAgICAgICBwYXRyaW1vbmlvX25ldG8gPSBwYXRyaW1vbmlvX25ldG8vaXBjXzE4LA0KICAgICAgICAgS1RBID0gcHB5ZSArIGJpZW5lc19kZV9jYW1iaW8sDQogICAgICAgICBzZWN0b3IgPSAiTWVtb3JpYSBkZSBZUEYiKSAlPiUgDQogIHNlbGVjdChhbmlvLCBzZWN0b3IsIHVuaWRhZCwgZXZlcnl0aGluZyguKSkgDQpiYWxhbmNlX3lwZg0KDQpzdG9ja195cGYgPC0gYmFsYW5jZV95cGYgJT4lIA0KICBnYXRoZXIoa2V5ID0gdmFyaWFibGUsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLCANCiAgICAgICAgIDQ6bmNvbCguKSkgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgJWluJSBjKCJLVEEiLCAiYWN0aXZvIiwgInBweWUiKSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSBjYXNlX3doZW4oYW5pbyA9PSAxOTgzIH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPT0gMTk4NSB+IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5ODYgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTg3IH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPT0gMTk4OCB+IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdmFsb3IpKSAlPiUNCiAgYmluZF9yb3dzKHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JSANCiAgICB1bmdyb3VwKCkgJT4lIA0KICAgIHNlbGVjdChhbmlvLCAgc2VjdG9yID1lbXByZXNhLCB1bmlkYWQsIHZhcmlhYmxlLCB2YWxvciApICU+JSANCiAgICBmaWx0ZXIoc2VjdG9yID09ICJZUEYiLA0KICAgICAgICAgICB2YXJpYWJsZSAgJWluJSBjKCJLVEEiLCAiYWN0aXZvIiwgInBweWUiKSkpDQogIA0KDQpgYGANCg0KIyMjIFN0b2NrIHRvdGFsIGRlIGxhIHJhbWEgDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBTdG9jayBkZSBsYSByYW1hDQpzdG9ja19yYW1hIDwtIHN0b2NrX2FmaXAgJT4lIA0KICBiaW5kX3Jvd3Moc3RvY2tfYmFsYW5jZXNfcmFtYSkNCg0KIyB3cml0ZS5jc3Yoc3RvY2tfcmFtYSwgZmlsZSA9Ii9BcmNoaXZvcy9EYXRvcy9TdG9jay9zdG9ja19oaWRyb2NhcmJ1cm9zLmNzdiIpDQoNCg0KZ3JhZl9zdG9ja19yYW1hIDwtIHN0b2NrX3JhbWEgJT4lIA0KICAjIG11dGF0ZSh2YWxvciA9IG51bWJlcl9mb3JtYXQodmFsb3IsIGJpZy5tYXJrID0gIiAiICkpICU+JSANCiAgZmlsdGVyKHNlY3RvciAhPSAiZGlzdHJpYnVjaW9uIikgJT4lDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gc2VjdG9yLCBzaGFwZSA9IGZ1ZW50ZSkpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludChzaXplID0gLjgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiU3RvY2sgZGUgY2FwaXRhbCBhZGVsYW50YWRvIHkgYWN0aXZvIGRlIHNlZ21lbnRvcyIsDQogICAgICAgc3VidGl0bGUgPSAiU3Vic2VjdG9yZXMgZGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybyIsDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgZmFjZXRfd3JhcCh+IHZhcmlhYmxlICkNCg0KZ2dwbG90bHkoZ3JhZl9zdG9ja19yYW1hLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCg0KIyMjIFN0b2NrIGRlIHNlZ21lbnRvcyBkZSBZUEYgeSBQZXRyb2JyYXMNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpncmFmX3N0b2NrX3NlZ21lbnRvcyA8LSB1bmlvbl9zZWdtZW50b3MgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHNlY3RvcikpKw0KICBnZW9tX2xpbmUoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlN0b2NrIGRlIGNhcGl0YWwgZGUgc2VnbWVudG9zIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJZUEYgeSBQZXRyb2JyYXMgQXJnZW50aW5hIiwNCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICBmYWNldF93cmFwKHZhcmlhYmxlIH4gZW1wcmVzYSApDQoNCmdncGxvdGx5KGdyYWZfc3RvY2tfc2VnbWVudG9zLCB3aWR0aCA9IDcwMCwgaGVpZ2h0ID0gNTAwKQ0KDQoNCmBgYA0KDQojIyMgU3RvY2sgcG9yIGVtcHJlc2FzDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmdyYWZfc3RvY2tfZW1wIDwtIHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JQ0KICBmaWx0ZXIoDQogICAgIyB2YXJpYWJsZSAlaW4lIGMoIktUQSIsICJhY3Rpdm8iKSwNCiAgICAgICAgIHNlY3RvciAhPSAiZGlzdHJpYnVjaW9uIikgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGVtcHJlc2EpKSsgDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiU3RvY2sgZGUgY2FwaXRhbCBwb3IgZW1wcmVzYSIsDQogICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICBmYWNldF93cmFwKH52YXJpYWJsZSkNCmdncGxvdGx5KGdyYWZfc3RvY2tfZW1wLCB3aWR0aCA9IDcwMCwgaGVpZ2h0ID0gNTAwKQ0KDQoNCmBgYA0KDQojIyMgWVBGIGxhcmdvIHBsYXpvDQpDb21wYXJhY2nDs24gZW50cmUgbGEgTWVtb3JpYSBZUEYgKHJlY29waWxhZG8gcG9yIEJGUikgeSBsb3MgYmFsYW5jZXMgZXh0csOtYWRvcyBkZSBCb2xzYXINCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmdyYWZfc3RvY2tfeXBmIDwtICBzdG9ja195cGYgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHNlY3RvcikpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJTdG9jayBkZSBjYXBpdGFsIGRlIFlQRiIsDQogICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICBmYWNldF93cmFwKH52YXJpYWJsZSkNCmdncGxvdGx5KGdyYWZfc3RvY2tfeXBmLCB3aWR0aCA9IDcwMCwgaGVpZ2h0ID0gNTAwKQ0KDQpgYGANCg0KIyMjIEVzdGltYWNpw7NuIGRlIHN0b2NrIGRlIGNhcGl0YWwgYSBwYXJ0aXIgZGUgbGEgZXZvbHVjacOzbiBkZSBwb3pvcyBwZXJmb3JhZG9zDQoNCg0KRWwgZWplcmNpY2lvIGNvbnNpc3RlIGVuIHZlcmlmaWNhciBzaSBsb3MgcG96b3MgdGVybWluYWRvcyBzaXJ2ZW4gY29tbyBpbmRpY2Fkb3IgZGUgbGEgaW52ZXJzacOzbiB5LCBwb3IgbG8gdGFudG8sIGRlIGFwcm94aW1hZG9yIGFsIHN0b2NrIGRlIGNhcGl0YWwgYWRlbGFudGFkby4gUGFyYSBlbGxvIHNlIHBhcnRlIGRlIHVuIGHDsW8gYmFzZSBkZSBsYSBzZXJpZSBkZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyBkZWwgc2VjdG9yIGV4dHJhY2Npw7NuIGRlIEJvbHNhciB5IEFGSVAsIHBhcmEgbHVlZ28gaW5kZXhhciBsYXMgdmFyaWFibGVzIHBvciBsYSBldm9sdWNpw7NuIGRlIGxvcyBwb3pvcy4gTG9zIGJhbGFuY2VzIGRlIEJvbHNhciBxdWUgY29ycmVzcG9uZGVuIMO6bmljYW1lbnRlIGEgZXh0cmFjY2nDs24gc29uIGRvczogUEFFIHkgVGVjcGV0cm9sLCBwb3IgbG8gcXVlIGVsIHZhbG9yIG9idGVuaWRvIHB1ZWRlIGVzdGFyIHN1YnJlcHJlc2VudGFkbyBwYXJhIGRhciBjdWVudGEgZGVsIHRvdGFsIGRlIGxhIHJhbWEuIENvbiByZXNwZWN0byBhbCDDrW5kaWNlIGRlIHBvem9zLCBzZSB0b21hcm9uIGRvcyBzZXJpZXMgYWx0ZXJuYXRpdmFzOiB1bmEgY29uc3RydcOtZGEgYSBwYXJ0aXIgZGVsIHN0b2NrIGRlIHBvem9zIGVuIGV4dHJhY2Npw7NuIGVmZWN0aXZhIChmdWVudGU6IElBUEcpIHkgb3RyYSBlbGFib3JhZGEgY29uIGxvcyBwb3pvcyB0ZXJtaW5hZG9zIGFudWFsZXMgY2FyZ2Fkb3MgcG9yIGVtcHJlc2Egb3BlcmFkb3JhIChmdWVudGU6IFNlY3JldGFyw61hIGRlIEVuZXJnw61hKS4gIA0KDQpFbCBhw7FvIGJhc2UgZWxlZ2lkbyBlcyAyMDA2LCBkYWRvIHF1ZSBlcyBlbCDDumx0aW1vIGRhdG8gcXVlIHBvc2VlbW9zIGRlbCBzdG9jayBkZSBwb3pvcyB0b3RhbGVzIGVuIGFjdGl2aWRhZCBkZSBJQVBHLg0KDQpTZSByZWFsaXrDsyBsYSBtaXNtYSBlc3RpbWFjacOzbiBwYXJhIFlQRiwgZmlsdHJhbmRvIGxhcyB2YXJpYWJsZXMgZGUgUHJvcGllZGFkLCBQbGFudGEgeSBFcXVpcG8gKHBhcmEgZWwgdG90YWwgZGUgbGEgZW1wcmVzYSwgcG9yIGxvIHF1ZSBpbmNsdXllIG5vIHPDs2xvIGV4dHJhY2Npw7NuIHNpbm8gcmVmaW5hY2nDs24geSBvdHJvcyBydWJyb3MpIHkgYWN0aXZvIHRvdGFsIGRlbCB1cHN0cmVhbS4gU2UgdXRpbGl6w7Mgw7puaWNhbWVudGUgZWwgaW5kaWNlIGRlIHBvem9zIHRlcm1pbmFkb3MgYW51YWxlcyBkZSBZUEYgcGFyYSBlc3RpbWFyIGxhIFBQeUUgeSBlbCAgYWN0aXZvLCBkYWRvIHF1ZSBubyBzZSBwb3NlZSB2YWxvcmVzIGRlbCBzdG9jayBkZSBwb3pvcyBlbiBwZXJmb3JhY2nDs24gcGFyYSBsb3MgYcOxb3MgZW4gZG9uZGUgZXhpc3RlbiB2YWxvcmVzIGNvbnRhYmxlcyBxdWUgc2lydmFuIGRlIGHDsW8gYmFzZS4gTHVlZ28sIHNlIGVzdGltw7MgdW4gc3RvY2sgZGUgY2FwaXRhbCB0b3RhbCBkZSByYW1hIGEgcGFydGlyIGRlIHBvbmRlcmFyIGVsIHN0b2NrIGRlIFlQRiBwb3IgbGEgcmVsYWNpw7NuIGVudHJlIGxvcyBwb3pvcyBkZSBZUEYgeSBsb3MgcG96b3MgdG90YWxlcyBkZSBsYSByYW1hLg0KDQoNCkVuIHPDrW50ZXNpcywgZWwgbGlzdGFkbyBkZSB2YXJpYWJsZXMgZXN0aW1hZGFzLSBhIHBhcnRpciBkZSBsYXMgZG9zIHNlcmllcyBkZSBwb3pvcyAoc3RvY2sgeSBmbHVqbyksc2Fsdm8gcGFyYSBsYSBlc3RpbWFjacOzbiBkZSBZUEYgcXVlIHNvbG8gc2UgcHVkbyBoYWNlciBjb24gZmx1am8gZGUgcG96b3MgcG9yIGF1c2VuY2lhIGRlIGluZm9ybWFjacOzbi0gZXMgbGFzIHNpZ3VpZW50ZXM6DQoNCiogJHBweWVcX2VzdGltYWRvXF9ib2xzYXIkID0gJFBQeUVcIGHDsW9cIGJhc2VcIGRlXCBCb2xzYXIkICogJGluZGljZVwgZGVcIHBvem9zJA0KKiAkcHB5ZVxfZXN0aW1hZG9cX2FmaXAkID0gJFBQeUVcIGHDsW9cIGJhc2VcIGRlXCBBRklQJCAqICRpbmRpY2VcIGRlXCBwb3pvcyQNCg0KKiAkcHB5ZVxfZXN0aW1hZG9cX3lwZiQgPSAkUFB5RVwgYcOxb1wgYmFzZVwgZGVcIFlQRiQgKiAkaW5kaWNlXCBkZVwgcG96b3NcIFlQRiQNCiogJGFjdGl2b1xfZXN0aW1hZG9cX3Vwc3RyZWFtXF95cGYkID0gJEFjdGl2b1wgYcOxb1wgYmFzZVwgZGVcIFlQRiQgKiAkaW5kaWNlXCBkZVwgcG96b3NcIFlQRiQNCg0KKiAkcHB5ZVxfZXN0aW1hZG9cX3RvdGFsJCA9ICRwcHllXF9lc3RpbWFkb1xfeXBmJCAqICQkXGZyYWN7cG96b3NcIHRvdGFsZXN9e3Bvem9zXCBkZVwgWVBGfSQkDQoNCiogJGFjdGl2b1xfZXN0aW1hZG9cX3Vwc3RyZWFtJCA9ICRhY3Rpdm9cX2VzdGltYWRvXF91cHN0cmVhbVxfeXBmJCAgKiAkJFxmcmFje3Bvem9zXCB0b3RhbGVzfXtwb3pvc1wgZGVcIFlQRn0kJA0KDQpQYXJhIHBvZGVyIHNlbGVjY2lvbmFyIGxhIGVzdGltYWNpw7NuIG3DoXMgYWRlY3VhZGEsIHNlIHJlYWxpesOzIHVuIGFuw6FsaXNpcyBkZSBjb3JyZWxhY2nDs24gZW50cmUgdG9kYXMgbGFzIHNlcmllcyBlc3RpbWFkYXMgeSBsb3MgdmFsb3JlcyBjb250YWJsZXMgcXVlIHNlIHBvc2VlbiBkZSBQUHlFIGRlIEFGSVAsIEJvbHNhciBlIFlQRi4gU2UgcHJlc2VudGFuIGRpc3RpbnRvcyBjdWFkcm9zIGRlIGNvcnJlbGFjaW9uZXMsIGNvbiBzdXMgbml2bGVzIGRlIHNpZ25pZmljYW5jaWEsIGRpYWdyYW1hcyBkZSBkaXNwZXJzacOzbiBlbnRyZSB2YXJpYWJsZXMgeSBzdSBkaXN0cmlidWNpw7NuLiBMYXMgc2VyaWVzIGNvbnN0cnXDrWRhcyBxdWUgcG9zZWVuIG1lam9yIGNvcnJlbGFjacOzbiBzb24gbGEgUHJvcGllZGFkLCBQbGFudGEgeSBFcXVpcG8gYSBwYXJ0aXIgZGUgQm9sc2FyIGVzdGltYWRhcyBjb24gw61uZGljZSBkZSBzdG9jayBkZSBwb3pvcyAoY29ycmVsYWNpw7NuIGZ1ZXJ0ZSBkZSAwLjg5IHkgc2lnbmlmaWNhdGl2YSBhbCAwLjAwMSkgeSBmbHVqbyBkZSBwb3pvcyAoY29ycmVsYWNpw7NuIG1vZGVyYWRhIGRlIDAuNTQgeSBzaWduaWZpY2F0aXZhIGFsIDAuMDUpIHkgbHVlZ28gZWwgYWN0aXZvIGRlbCB1cHN0cmVhbSB0b3RhbCBkZSBsYSByYW1hIGEgcGFydGlyIGRlIFlQRiAoY29ycmVsYWNpw7NuIG1vZGVyYWRhIGRlIDAuNDIgeSBzaWduaWZpY2F0aXZhIGFsIDAuMSBjb24gbG9zIHZhbG9yZXMgY29udGFibGVzIGRlIFlQRiB5IGNvcnJlbGFjacOzbiBmdWVydGUgZGUgMC44OCB5IHNpZ25pZmljYXRpdmEgYWwgMC4wMDEgY29uIGxhcyBlc3RpbWFjaW9uZXMgZGUgUFB5RSBkZSBBRklQIHkgQm9sc2FyIGEgcGFydGlyIGRlIGZsdWpvIGRlIHBvem9zKS4NCg0KbGEgZXN0aW1hY2nDs24gdGllbmUgcXVlIHJlYWxpemFyc2UgY29uIFBQeUUgcG9ycXVlIGhheSBxdWUgZXhjbHVpciBzYWxhcmlvcyBlIGludmVudGFyaW9zIChxdWUgZXN0w6FuIGVuIEtUQSkNCg0KIyMjIyBBbsOhbGlzaXMgZGUgY29ycmVsYWNpb24gZW50cmUgUHJvcGllZGFkLCBQbGFudGEgeSBFcXVpcG8geSBQb3pvcyBlbiBwcm9kdWNjacOzbg0KDQoNCnJlZW1wbGF6YXIgaXBjIHBvciB1biBpYmlmIG8gaW5kaWNlIGVzcGVjaWZpY28NCg0KIyMjIyMgVG90YWwgcmFtYQ0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0Kc3RvY2tfeV9wb3pvc190YXNhcyA8LSBzdG9ja19yYW1hICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIiAmIHNlY3RvciAlaW4lIGMoImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIiwgInByb2R1Y2Npb24iKSkgJT4lDQogIHNlbGVjdChhbmlvLCB2YWxvcixmdWVudGUpICU+JQ0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgc3ByZWFkKGtleSA9IGZ1ZW50ZSwgdmFsdWUgPSB2YWxvcikgJT4lIA0KICBtdXRhdGUoQUZJUCA9IHZhcmlhY2lvbl9pbnRlcmFudWFsKEFGSVApLA0KICAgICAgICAgQm9sc2FyID0gdmFyaWFjaW9uX2ludGVyYW51YWwoQm9sc2FyKSkgJT4lIA0KICBmdWxsX2pvaW4oY29tcGFyYWNpb25fcG96b3MgDQogICAgICAgICAgICAlPiUNCiAgICAgICAgICAgICMgc2VsZWN0KC0gcG96b3NfcGVyZm9yYWRvc19pYXBnKQ0KICAgICAgICAgICAgc2VsZWN0KC0gcG96b3NfdmFyaWFjaW9uX2lhcGcpDQogICAgICAgICAgICAsIGJ5ID0gImFuaW8iKSAlPiUNCiAgcmVuYW1lKHBweWVfYWZpcCA9IEFGSVAsDQogICAgICAgICBwcHllX2JvbHNhciA9IEJvbHNhciwNCiAgICAgICAgIHBvem9zX2lhcGcgPSBwb3pvc19wZXJmb3JhZG9zX2lhcGcsDQogICAgICAgICAjIHBvem9zX2lhcGdfY2VudGVuYXJpbyA9IHBvem9zX3ZhcmlhY2lvbl9pYXBnLA0KICAgICAgICAgcG96b3NfdGVybWluYWRvcyA9IHBvem9zX3Rlcm1pbmFkb3Nfc2VjX2VuZXJnaWEsDQogICAgICAgICBwb3pvc19jYXJnYWRvcyA9IHBvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhICkgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JQ0KICBmaWx0ZXIoYW5pbyA+IDE5OTgpICU+JQ0KICBzZWxlY3QoLWFuaW8pICU+JQ0KICBtdXRhdGVfYWxsKHRhc2FfY3JlY2ltaWVudG8pICANCiAgDQoNCg0KR0dhbGx5OjpnZ3BhaXJzKHN0b2NrX3lfcG96b3NfdGFzYXMsIGxvd2VyID0gbGlzdChjb250aW51b3VzID0gInNtb290aCIpKQ0KcGxvdChzdG9ja195X3Bvem9zX3Rhc2FzKQ0KDQojIHJvdW5kKHZhcihzdG9ja195X3Bvem9zX3Rhc2FzLCBuYS5ybSA9IFRSVUUpLCA0KQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KI21hdHJpeiBkZSBjb3JyZWxhY2lvbg0KY29yX3Bvem9zIDwtIGNvcihzdG9ja195X3Bvem9zX3Rhc2FzLCB1c2UgPSAiY29tcGxldGUub2JzIikNCmNvcl9wb3pvcw0KDQojICBkaXN0aW50b3MgY29ycmVsb2dyYW1hcw0KI2NvbiBnZ2NvcnJwbG90DQpsaWJyYXJ5KGdnY29ycnBsb3QpDQpwLm1hdCA9IGNvcl9wbWF0KHN0b2NrX3lfcG96b3NfdGFzYXMpDQpnZ2NvcnJwbG90KGNvcl9wb3pvcywgaGMub3JkZXIgPSBUUlVFLA0KICAgIHR5cGUgPSAibG93ZXIiLCBwLm1hdCA9IHAubWF0LCBsYWIgPSBUKQ0KDQojICMgI2NvbiBjb3JycGxvdA0KIyBjb2wgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCIjQkI0NDQ0IiwgIiNFRTk5ODgiLCAiI0ZGRkZGRiIsICIjNzdBQUREIiwgIiM0NDc3QUEiKSkNCiMgY29ycnBsb3Q6OmNvcnJwbG90KGNvcl9wb3pvcywgbWV0aG9kPSJjb2xvciIsIGNvbD1jb2woMjAwKSwNCiMgICAgICAgICAgdHlwZT0idXBwZXIiLCBvcmRlcj0iaGNsdXN0IiwNCiMgICAgICAgICAgYWRkQ29lZi5jb2wgPSAiYmxhY2siLCAjIEFkZCBjb2VmZmljaWVudCBvZiBjb3JyZWxhdGlvbg0KIyAgICAgICAgICB0bC5jb2w9ImJsYWNrIiwgdGwuc3J0PTQ1LCAjVGV4dCBsYWJlbCBjb2xvciBhbmQgcm90YXRpb24NCiMgICAgICAgICAgIyBDb21iaW5lIHdpdGggc2lnbmlmaWNhbmNlDQojICAgICAgICAgICMgcC5tYXQgPSBwLm1hdCwNCiMgICAgICAgICAgIyBpbnNpZyA9ICJibGFuayIsDQojICAgICAgICAgIHNpZy5sZXZlbCA9IDAuMDEpDQoNCiMgIyAjY29uIGdnZ2FsbHkNCiMgR0dhbGx5OjpnZ2NvcnIoc3RvY2tfeV9wb3pvc190YXNhcywgbWV0aG9kID0gYygiY29tcGxldGUub2JzIiwgInBlYXJzb24iKSAsDQojICAgICAgICAgICAgICAgIGxhYmVsID0gVCwgbGFiZWxfcm91bmQgPSAyKQ0KYGBgDQoNCmBgYHtyfQ0KI2HDsW9zIGJhc2UgMjAwNg0KcHB5ZV9hbmlvX2Jhc2VfYm9sc2FyIDwtIChzdG9ja19yYW1hICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIiAmIHNlY3RvciA9PSAicHJvZHVjY2lvbiIpICU+JQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcHllID0gdmFsb3IpKQ0KcHB5ZV9hbmlvX2Jhc2VfYm9sc2FyIDwtIHBweWVfYW5pb19iYXNlX2JvbHNhciRwcHllW3BweWVfYW5pb19iYXNlX2JvbHNhciRhbmlvID09MjAwNl0NCg0KIyB2YWxvcl9iYXNlIDwtIHNlcmllW3doaWNoKGZlY2hhPT1mZWNoYV9iYXNlKV0NCg0KcHB5ZV9hbmlvX2Jhc2VfYWZpcCA8LSAoc3RvY2tfcmFtYSAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZSIgJiBzZWN0b3IgPT0gImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIikgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHBweWUgPSB2YWxvcikpDQpwcHllX2FuaW9fYmFzZV9hZmlwIDwtIHBweWVfYW5pb19iYXNlX2FmaXAkcHB5ZVtwcHllX2FuaW9fYmFzZV9hZmlwJGFuaW8gPT0gMjAwNl0NCg0KDQpzdG9ja195X3Bvem9zIDwtICBjb21wYXJhY2lvbl9wb3pvcyAlPiUgDQogIGdhdGhlcihrZXkgPSBmdWVudGVfcG96bywNCiAgICAgICAgIHZhbHVlID0gY2FudGlkYWRfcG96b3MsDQogICAgICAgICAyOm5jb2woLikpICU+JQ0KICBhcnJhbmdlKGZ1ZW50ZV9wb3pvLGFuaW8pICU+JSANCiAgZ3JvdXBfYnkoZnVlbnRlX3Bvem8pICU+JSANCiAgbXV0YXRlKGluZGljZV9wb3pvc18wNiA9IGdlbmVyYXJfaW5kaWNlKHNlcmllPSBjYW50aWRhZF9wb3pvcyAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDA2KSkgJT4lIA0KICAjIGxlZnRfam9pbihzdG9ja19yYW1hICU+JSAgDQogICMgICAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIiAmIHNlY3RvciAlaW4lIGMoImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIiwgInByb2R1Y2Npb24iKSkgJT4lDQogICMgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHBweWUgPSB2YWxvciwgZnVlbnRlX3N0b2NrID0gZnVlbnRlKSwgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHBweWVfYWZpcCA9IHBweWVfYW5pb19iYXNlX2FmaXAgKiBpbmRpY2VfcG96b3NfMDYsDQogICAgICAgICBwcHllX2JvbHNhciA9cHB5ZV9hbmlvX2Jhc2VfYm9sc2FyICogaW5kaWNlX3Bvem9zXzA2LA0KICAgICAgICAgdW5pZGFkX3BweWU9Ik1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSAlPiUgDQogIGdhdGhlcihrZXkgPSBmdWVudGVfcHB5ZSwNCiAgICAgICAgIHZhbHVlID0gcHB5ZV9lc3RpbWFkbywNCiAgICAgICAgIDU6NikNCnN0b2NrX3lfcG96b3MNCg0KZ2dwbG90bHkoc3RvY2tfeV9wb3pvcyAlPiUgDQogIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbyxwcHllX2VzdGltYWRvICwgY29sb3IgPSBmdWVudGVfcG96bykpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh5PSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICBmYWNldF93cmFwKH5mdWVudGVfcHB5ZSAgICApLA0KICAgIHdpZHRoID0gODAwLCBsZW5ndGggPTUwMCkNCg0KI3N0b2NrIGVzdGltYWRvIGEgcGFydGlyIGRlIHBvem9zDQpzdG9ja19lc3RpbWFkbyA8LSBzdG9ja195X3Bvem9zICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZmlsdGVyKGZ1ZW50ZV9wb3pvID09InBvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhIiwgZnVlbnRlX3BweWUgPT0icHB5ZV9ib2xzYXIiKSAlPiUgDQogIHJlbmFtZSh1bmlkYWQgPSB1bmlkYWRfcHB5ZSwgdmFsb3IgPXBweWVfZXN0aW1hZG8pICU+JSANCiAgc2VsZWN0KC1jKGNhbnRpZGFkX3Bvem9zLCBpbmRpY2VfcG96b3NfMDYsIGZ1ZW50ZV9wb3pvKSkNCg0KDQojZGlmZXJlbmNpYSBlbnRyZSBwcHllIGVzdGltYWRhIHkgdmFsb3IgY29udGFibGUgZGUgYm9sc2FyDQpzdG9ja19lc3RpbWFkbyAlPiUgDQogIGxlZnRfam9pbihzdG9ja19yYW1hICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGZ1ZW50ZT09IkJvbHNhciIsIHZhcmlhYmxlID09InBweWUiLCBzZWN0b3IgPT0gInByb2R1Y2Npb24iKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIHBweWVfYm9sc2FyID0gdmFsb3IpKSAlPiUgDQogIG5hLm9taXQoKSAlPiUgDQogIG11dGF0ZShkaWZmID0gKHZhbG9yL3BweWVfYm9sc2FyIC0xKSoxMDApDQoNCiNjYW1iaW8gc3RvY2sgc29sbyBwYXJhIGxvcyBhw7FvcyBxdWUgdGVuZW1vcyBCT0xTQVINCnN0b2NrX2VzdGltYWRvIDwtIHN0b2NrX3JhbWEgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoZnVlbnRlPT0iQm9sc2FyIiwgdmFyaWFibGUgPT0icHB5ZSIsIHNlY3RvciA9PSAicHJvZHVjY2lvbiIpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCxmdWVudGVfcHB5ZT1mdWVudGUgLCB2YWxvcikNCiAgDQogIA0KYGBgDQoNCg0KIyMjIyMjIFN0b2NrIGRlIHBvem9zDQpgYGB7cn0NCnN0b2NrX3lfcG96b3NfdGFzYXNfdjIgPC0gc3RvY2tfcmFtYSAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZSIgJiBzZWN0b3IgJWluJSBjKCJleHRyYWNjaW9uX3BldHJvbGVvX2dhcyIsICJwcm9kdWNjaW9uIikpICU+JQ0KICBzZWxlY3QoYW5pbywgdmFsb3IsZnVlbnRlKSAlPiUNCiAgc3ByZWFkKGtleSA9IGZ1ZW50ZSwgdmFsdWUgPSB2YWxvcikgJT4lIA0KICBmdWxsX2pvaW4ocG96b3NfaWFwZ19jZW50ZW5hcmlvJT4lDQogICAgICAgICAgICBzZWxlY3QoYW5pbywgcG96b3NfaWFwZyA9IHRvdGFsZXMgKSwgYnkgPSAiYW5pbyIpICU+JQ0KICByZW5hbWUocHB5ZV9hZmlwID0gQUZJUCwNCiAgICAgICAgIHBweWVfYm9sc2FyID0gQm9sc2FyICkgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JQ0KICBmaWx0ZXIoYW5pbyA+IDE5OTgpICU+JQ0KICBzZWxlY3QoLWFuaW8pICU+JQ0KICBtdXRhdGVfYWxsKHRhc2FfY3JlY2ltaWVudG8pICANCiAgDQoNCg0KR0dhbGx5OjpnZ3BhaXJzKHN0b2NrX3lfcG96b3NfdGFzYXNfdjIsIGxvd2VyID0gbGlzdChjb250aW51b3VzID0gInNtb290aCIpKQ0KcGxvdChzdG9ja195X3Bvem9zX3Rhc2FzX3YyKQ0KDQojIHJvdW5kKHZhcihzdG9ja195X3Bvem9zX3Rhc2FzLCBuYS5ybSA9IFRSVUUpLCA0KQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KI21hdHJpeiBkZSBjb3JyZWxhY2lvbg0KY29yX3Bvem9zIDwtIGNvcihzdG9ja195X3Bvem9zX3Rhc2FzX3YyLCB1c2UgPSAiY29tcGxldGUub2JzIikNCmNvcl9wb3pvcw0KDQojICBkaXN0aW50b3MgY29ycmVsb2dyYW1hcw0KI2NvbiBnZ2NvcnJwbG90DQpsaWJyYXJ5KGdnY29ycnBsb3QpDQpwLm1hdCA9IGNvcl9wbWF0KHN0b2NrX3lfcG96b3NfdGFzYXMpDQpnZ2NvcnJwbG90KGNvcl9wb3pvcywgaGMub3JkZXIgPSBUUlVFLA0KICAgIHR5cGUgPSAibG93ZXIiLCBwLm1hdCA9IHAubWF0LCBsYWIgPSBUKQ0KDQojICMgI2NvbiBjb3JycGxvdA0KIyBjb2wgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCIjQkI0NDQ0IiwgIiNFRTk5ODgiLCAiI0ZGRkZGRiIsICIjNzdBQUREIiwgIiM0NDc3QUEiKSkNCiMgY29ycnBsb3Q6OmNvcnJwbG90KGNvcl9wb3pvcywgbWV0aG9kPSJjb2xvciIsIGNvbD1jb2woMjAwKSwNCiMgICAgICAgICAgdHlwZT0idXBwZXIiLCBvcmRlcj0iaGNsdXN0IiwNCiMgICAgICAgICAgYWRkQ29lZi5jb2wgPSAiYmxhY2siLCAjIEFkZCBjb2VmZmljaWVudCBvZiBjb3JyZWxhdGlvbg0KIyAgICAgICAgICB0bC5jb2w9ImJsYWNrIiwgdGwuc3J0PTQ1LCAjVGV4dCBsYWJlbCBjb2xvciBhbmQgcm90YXRpb24NCiMgICAgICAgICAgIyBDb21iaW5lIHdpdGggc2lnbmlmaWNhbmNlDQojICAgICAgICAgICMgcC5tYXQgPSBwLm1hdCwNCiMgICAgICAgICAgIyBpbnNpZyA9ICJibGFuayIsDQojICAgICAgICAgIHNpZy5sZXZlbCA9IDAuMDEpDQoNCiMgIyAjY29uIGdnZ2FsbHkNCiMgR0dhbGx5OjpnZ2NvcnIoc3RvY2tfeV9wb3pvc190YXNhcywgbWV0aG9kID0gYygiY29tcGxldGUub2JzIiwgInBlYXJzb24iKSAsDQojICAgICAgICAgICAgICAgIGxhYmVsID0gVCwgbGFiZWxfcm91bmQgPSAyKQ0KYGBgDQoNCg0KIyMjIyMgWVBGDQpgYGB7cn0NCnBweWVfeXBmIDwtIHlwZl9zZWcgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICA9PSAidXBzdHJlYW0iICkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgaXBjXzE4KSwgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHZhcmlhYmxlID0gImFjdGl2b191cHN0cmVhbV95cGYiLA0KICAgICAgICAgYWN0aXZvcyA9IGFjdGl2b3MvaXBjXzE4LA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSU+JSANCiAgc2VsZWN0KGFuaW8sIGVtcHJlc2EsIHVuaWRhZCAsICBhY3Rpdm9fdXBzdHJlYW09IGFjdGl2b3MpICU+JSANCiAgbGVmdF9qb2luKHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JSANCiAgICB1bmdyb3VwKCkgJT4lIA0KICAgIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZSIgJiBlbXByZXNhID09ICJZUEYiKSAlPiUNCiAgICBzZWxlY3QoYW5pbywgZW1wcmVzYSwgdW5pZGFkLCBwcHllX2ludGVncmFkYSA9dmFsb3IpICwgYnkgPSBjKCJhbmlvIiwgImVtcHJlc2EiLCAidW5pZGFkIikpICU+JSANCiAgbXV0YXRlKGFjdGl2b191cHN0cmVhbSA9IHZhcmlhY2lvbl9pbnRlcmFudWFsKGFjdGl2b191cHN0cmVhbSksDQogICAgICAgICBwcHllX2ludGVncmFkYSA9IHZhcmlhY2lvbl9pbnRlcmFudWFsKHBweWVfaW50ZWdyYWRhKSkgJT4lIA0KICBmdWxsX2pvaW4obGlzdGFkb19wb3pvcyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KC1lbXByZXNhKSAlPiUgDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihpZGVtcHJlc2EgPT0gIllQRiIpICU+JSANCiAgICAgICAgICAgICAgcmVuYW1lKGFuaW8gPSBhbmlvX3Rlcm1pbmFjaW9uX3Bvem8sIGVtcHJlc2EgPSBpZGVtcHJlc2EpLCBieSA9IGMoImFuaW8iLCAiZW1wcmVzYSIpICkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQpwcHllX3lwZg0KDQpwcHllX3lwZl90YXNhcyA8LSBwcHllX3lwZiAlPiUNCiAgIGFycmFuZ2UoYW5pbykgJT4lDQogIGZpbHRlcihhbmlvICVpbiUgMTk5ODoyMDE4KSAlPiUNCiAgc2VsZWN0KC1jKGFuaW8sIGVtcHJlc2EsIHVuaWRhZCkpICU+JQ0KICBtdXRhdGVfYWxsKHRhc2FfY3JlY2ltaWVudG8pDQoNCiNtYXRyaXogZGUgY29ycmVsYWNpb24NCmNvcl9wb3pvc195cGYgPC0gY29yKHBweWVfeXBmX3Rhc2FzLCB1c2UgPSAiY29tcGxldGUub2JzIikNCmNvcl9wb3pvc195cGYNCg0KIyAgZGlzdGludG9zIGNvcnJlbG9ncmFtYXMNCiNjb24gZ2djb3JycGxvdA0KcC5tYXQgPSBjb3JfcG1hdChjb3JfcG96b3NfeXBmKQ0KZ2djb3JycGxvdChjb3JfcG96b3NfeXBmLCBoYy5vcmRlciA9IFRSVUUsDQogICAgdHlwZSA9ICJsb3dlciIsIHAubWF0ID0gcC5tYXQsIGxhYiA9IFQpDQoNCkdHYWxseTo6Z2dwYWlycyhwcHllX3lwZl90YXNhcywgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSAic21vb3RoIikpDQpwbG90KHBweWVfeXBmX3Rhc2FzKQ0KYGBgDQoNCg0KYGBge3J9DQojYcOxb3MgYmFzZXMNCmFuaW9fYmFzZV95cGZfc2VnbWVudG8gPC0gICBwcHllX3lwZiRhY3Rpdm9fdXBzdHJlYW1bcHB5ZV95cGYkYW5pbyA9PSAyMDA2XQ0KDQphbmlvX2Jhc2VfeXBmX2JvbHNhciA8LSBwcHllX3lwZiRwcHllX2ludGVncmFkYVtwcHllX3lwZiRhbmlvID09IDIwMDZdDQoNCg0Kc3RvY2tfeV9wb3pvc195cGYgPC0gIHBweWVfeXBmICU+JSANCiAgbXV0YXRlKGluZGljZV9wb3pvc18wNiA9IGdlbmVyYXJfaW5kaWNlKHNlcmllPSBwb3pvcyAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDA2KSkgJT4lIA0KICBtdXRhdGUocHB5ZV95cGZfZXN0aW1hZG8gPSBhbmlvX2Jhc2VfeXBmX2JvbHNhciAqIGluZGljZV9wb3pvc18wNiwNCiAgICAgICAgIGFjdGl2b195cGZfZXN0aW1hZG8gPWFuaW9fYmFzZV95cGZfc2VnbWVudG8gKiBpbmRpY2VfcG96b3NfMDYsDQogICAgICAgICB1bmlkYWRfcHB5ZT0iTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpDQoNCnN0b2NrX3lfcG96b3NfeXBmICU+JQ0KICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3BweWUsIHBweWVfeXBmX2VzdGltYWRvLCBhY3Rpdm9feXBmX2VzdGltYWRvKSAlPiUNCiAgICAgICAgICAgZ2F0aGVyKGtleSA9IGVzdGltYWNpb24sDQogICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWxvciwgDQogICAgICAgICAgICAgICAgICAgMzo0KSAlPiUgDQogICAgICAgICAgIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbyx2YWxvciAsIGNvbG9yID0gZXN0aW1hY2lvbikpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh5PSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIsIHRpdGxlID0gIkVzdGltYWNpb24gZGUgQWN0aXZvIHVzcHRyZWFtIHkgUFB5RSBkZSBZUEYgYSBwYXJ0aXIgZGUgaW5kaWNlIGRlIHBvem9zIikNCmBgYA0KDQojIyMjIyMgUFB5RSB5IGFjdGl2byB1cHN0cmVhbSB0b3RhbCByYW1hIGEgcGFydGlyIGRlIFlQRg0KDQpgYGB7cn0NCnBvem9zX3lmcF9zb2JyZV90b3RhbCA8LSBsaXN0YWRvX3Bvem9zICU+JQ0KICByZW5hbWUoYW5pbyA9IGFuaW9fdGVybWluYWNpb25fcG96bykgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShwb3pvc19jYXJnYWRvc19zZWNfZW5lcmdpYSA9IHN1bShwb3pvcywgbmEucm0gPSBUKSkgJT4lIA0KICBsZWZ0X2pvaW4obGlzdGFkb19wb3pvcyAlPiUNCiAgICAgICAgICAgICAgcmVuYW1lKGFuaW8gPSBhbmlvX3Rlcm1pbmFjaW9uX3Bvem8pICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGlkZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhbmlvLCBpZGVtcHJlc2EpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvem9zX2NhcmdhZG9zX3lwZiA9IHN1bShwb3pvcywgbmEucm0gPSBUKSkpICU+JSANCiAgbXV0YXRlKHlwZl9zb2JyZV90b3RhbCA9IHBvem9zX2NhcmdhZG9zX3lwZi9wb3pvc19jYXJnYWRvc19zZWNfZW5lcmdpYSkNCiMgcG96b3NfeWZwX3NvYnJlX3RvdGFsDQoNCmVzdGltYWNpb25fcHB5ZV90b3RhbF92aWFfeXBmIDwtIHN0b2NrX3lfcG96b3NfeXBmICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9wcHllLCBwcHllX3lwZl9lc3RpbWFkbywgYWN0aXZvX3lwZl9lc3RpbWFkbykgJT4lIA0KICBnYXRoZXIoa2V5ID0gZXN0aW1hY2lvbiwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsIA0KICAgICAgICAgMzo0KSAlPiUgDQogIGxlZnRfam9pbihwb3pvc195ZnBfc29icmVfdG90YWwgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgeXBmX3NvYnJlX3RvdGFsKSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvci95cGZfc29icmVfdG90YWwsDQogICAgICAgICAgZXN0aW1hY2lvbiA9IGNhc2Vfd2hlbihlc3RpbWFjaW9uID09ICJwcHllX3lwZl9lc3RpbWFkbyIgfiAicHB5ZV9lc3RpbWFkb190b3RhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWFjaW9uID09ICJhY3Rpdm9feXBmX2VzdGltYWRvIiB+ICJhY3Rpdm9fZXN0aW1hZG9fdXBzdHJlYW0iICkpDQogIA0KZXN0aW1hY2lvbl9wcHllX3RvdGFsX3ZpYV95cGYgJT4lDQogICAgICAgICAgIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbyx2YWxvciAsIGNvbG9yID0gZXN0aW1hY2lvbikpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh5PSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIsIA0KICAgICAgIHRpdGxlID0gIkVzdGltYWNpb24gZGUgQWN0aXZvIHVzcHRyZWFtIHkgUFB5RSB0b3RhbCBhIHBhcnRpciBkZSBhbXBsaWFjacOzbiBkZSBwb3pvcyBZUEYiKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQojIyBJbnZlcnNpb25lcw0KDQpGdWVudGVzOiANCg0KKiBCYWxhbmNlcyBkZSBCb2xzYXIuIEludmVyc2nDs24gY2FsY3VsYWRhIGEgcGFydGlyIGRlIHZhcmlhY2lvbmVzIGRlbCBhY3Rpdm8gKyBjb25zdW1vIGRlIGNhcGl0YWwgZmlqbyAoZXN0byDDumx0aW1vIGVzdMOhIHBlbmRpZW50ZSkNCiogU2VjcmV0YXJpYSBkZSBFbmVyZ8OtYS4gUmVzb2x1Y2nDs24gMjA1NyANCiAgKyBbSW52ZXJzaW9uZXMgcmVhbGl6YWRhcyBhw7FvIGFudGVyaW9yXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvaW52ZXJzaW9uZXMtZW4tbWVyY2Fkby1kZS1oaWRyb2NhcmJ1cm9zLXVwc3RyZWFtL2FyY2hpdm8vMjg1ZDQ1ZTUtMWI4OC00ZGFlLThlNWMtYzAxODQzYzdjOGMwKQ0KICArIFtJbnZlcnNpb25lcyBhbnVhbGVzIHByZXZpc3RhcyBhIHJlYWxpemFyIGVuIGVsIGHDsW8gZGUgbGEgcHJlc2VudGFjacOzbiBkZSBsYSBEREpKXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvaW52ZXJzaW9uZXMtZW4tbWVyY2Fkby1kZS1oaWRyb2NhcmJ1cm9zLXVwc3RyZWFtKQ0KDQoNCjQpIGNvbnN0cnVpciBzZXJpZSBkZSBpbnZlcnNpw7NuIHBhcmEgYXRyYXMgKGJ1c2NhciBTdG9jayBkZSBZUEYgcGVybyBzb2xvIHBhcmEgZXh0cmFjY2nDs24pLiBhcm1hciBlamVyY2ljaW8gZGUgRkQgeSB2ZXIgc2kgbGFzIHByb3BvcmNpb25lcyBzZSBtYW50aWVuZW4uIA0KDQoqIFJlY29uc3RydWNjaW9uIGRlIHNlcmllIGRlIGludmVyc2lvbiBwb3IgZW1wcmVzYQ0KdmVyIHVuIGZsdWpvIGRlIHBvem9zIHkgdW4gZmx1am8gZGUgaW52ZXJzaW9uIHkgbHVlZ28gdmVyIHNpIGxvIHF1ZSBtdWV2ZSBsYSBpbnZlcnNpb24gc29uIGxvcyBwb3pvcyAocXVlIHN1IGV2b2x1Y2lvbiBzZWEgc2ltaWxhcikuIA0KDQotIGludmVyc2lvbiBwb3IgZW1wcmVzYSAoYmFsYW5jZTogdmFyaWFjaW9uIGRlbCBhY3Rpdm8gKyBjb25zdW1vIGRlIEsgZmlqbykNCi0gaW52ZXJzaW9uIHBvciBlbXByZXNhIChzZWNyZXRhcmlhIGRlIGVuZXJnaWEpDQotIGludmVyc2lvbiBhZ3JlZ2FkYSAodGlwbyBkZSBpbnZlcnNpb24pIChjdWVudGFzIG5hY2lvbmFsZXM/KQ0KLSBwb3pvcyBudWV2b3MgcG9yIGVtcHJlc2EgcG9yIGHDsW8NCi0gcG96b3MgbnVldm9zIHRvdGFsZXMNCi0gYXBsaWNhciBNSVAgcGFyYSBZUEYgDQoNCkludmVyc2nDs24gYSBwYXJ0aXIgZGUgQmFsYW5jZXMNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmludmVyc2lvbmVzX2VtcHJlc2EgPC0gc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdCgtYyhmdWVudGUsIHNlY3RvcikpICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIikgJT4lDQogIGFycmFuZ2UoZW1wcmVzYSwgYW5pbykgJT4lIA0KICBncm91cF9ieSh1bmlkYWQsIHZhcmlhYmxlLCBlbXByZXNhKSAlPiUNCiAgbXV0YXRlKHZhbG9yID0gdmFyaWFjaW9uX2ludGVyYW51YWwodmFsb3IpKQ0KICAgDQojIGludmVyc2lvbmVzX2VtcHJlc2ENCg0KZ3JhZl9pbnZlcnNpb25lc19lbXByZXNhIDwtIGludmVyc2lvbmVzX2VtcHJlc2EgJT4lIA0KICBmaWx0ZXIoZW1wcmVzYSAhPSAiQ2FtdXp6aSBHYXMgUGFtcGVhbmEiKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZW1wcmVzYSkpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpb25lcyBwb3IgZW1wcmVzYSIsDQogICAgICAgc3VidGl0bGUgPSAiQSBwYXJ0aXIgZGUgYmFsYW5jZXMiLA0KICAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiLA0KICAgICAgIGNhcHRpb24gPSAiQmFsYW5jZXMgZGUgZW1wcmVzYXMgZXh0cmHDrWRvcyBkZSBCb2xzYXIiKSsNCiAgZmFjZXRfd3JhcCh+dmFyaWFibGUpDQojIGdncGxvdGx5KGdyYWZfaW52ZXJzaW9uZXNfZW1wcmVzYSwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCg0KYGBgDQoNCg0KSW52ZXJzacOzbiBhIHBhcnRpciBkZSBTZWNyZXRhcmlhIGRlIEVuZXJnw61hDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KaW52ZXJzaW9uZXNfYW5pb19hbnRlcmlvciA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9JbnZlcnNpb24vU2VjcmV0YXJpYSBkZSBFbmVyZ2lhL3Jlc29sdWNpbi0yMDU3LWludmVyc2lvbmVzLXJlYWxpemFkYXMtYW8tYW50ZXJpb3IuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhgRmVjaGEgRmluIFRhcmVhc2AgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJWQvJW0vJVkiKSwgDQogICAgICAgIGBGZWNoYSBJbmljaW8gVGFyZWFzYCA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlZC8lbS8lWSIpKSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIGRlIHByZXNlbnRhY2nDs24gZGUgbGEgRERKSiIsDQogICAgICAgICBlbXByZXNhID0gIkVtcHJlc2EgaW5mb3JtYW50ZSIsDQogICAgICAgICBjb25jZXB0byA9ICJEZXNjcmlwY2nDs24gZGVsIHBsYW4gZGUgYWNjacOzbiAoQ29uY2VwdG9zKSIsDQogICAgICAgICBjYW50aWRhZF9leHBsb3JhY2lvbiA9ICJDYW50LiBFeHBsb3JhY2lvbiIsDQogICAgICAgICBjYW50aWRhZF9leHBsb3RhY2lvbiA9ICJDYW50LiBFeHBsb3RhY2lvbiIsDQogICAgICAgICBjYW50aWRhZF9leHBsb3JhY2lvbl9jb21wbGVtZW50YXJpYSA9ICJDYW50LiBFeHBsb3JhY2lvbiBDb21wbGVtZW50YXJpYSIsDQogICAgICAgICBleHBsb3JhY2lvbl9taWxsb25lc191c2QgPSAiTWlsbG9uZXMgdSRzIEV4cGxvcmFjaW9uIiwNCiAgICAgICAgIGV4cGxvdGFjaW9uX21pbGxvbmVzX3VzZCA9ICJNaWxsb25lcyB1JHMgRXhwbG90YWNpb24iLA0KICAgICAgICAgZXhwbG9yYWNpb25fY29tcGxfbWlsbG9uZXNfdXNkID0gIk1pbGxvbmVzIHUkcyBFeHAuIENvbXBsZW1lbnRhcmlhIikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFuaW8gLSAxLA0KICAgICAgICAgZW1wcmVzYSA9Y2FzZV93aGVuKGVtcHJlc2EgPT0gIllQRiBTLkEuIiB+ICJZUEYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgKFNVQ1VSU0FMIEFSR0VOVElOQSkgTExDIiB+ICJQQUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgU0wiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUEVUUk9CUkFTIEFSR0VOVElOQSBTLkEuIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBFU0EgKFBFVFJPQlJBUyBFLlMuQS4pIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIkVOQVAgU0lQRVRST0wgQVJHRU5USU5BIFMuQS4iIH4gIkVOQVAgU0lQRVRST0wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0FVIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlNJTk9QRUMgQVJHRU5USU5BIEVYUExPUkFUSU9OIEFORCBQUk9EVUNUSU9OLCBJTkMuIiB+ICJTaW5vcGVjIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJURUNQRVRST0wgUy5BLiIgfiAiVGVjcGV0cm9sIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUExVU1BFVFJPTCBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQTFVTUEVUUk9MIEVORVJHWSBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJDT01QQcORw41BIEdFTkVSQUwgREUgQ09NQlVTVElCTEVTIFMuQS4iIH4gIkNHQyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiV0lOVEVSU0hBTEwgRU5FUkdJQSBTLkEuIiB+ICJXaW50ZXJzaGFsbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiWVNVUiBFTkVSR8ONQSBBUkdFTlRJTkEgUy5SLkwuIiB+ICJZU1VSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJZU1VSIFBFVFJPTEVSQSBBUkdFTlRJTkEgUy5BLiIgfiAiWVNVUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVE9UQUwgQVVTVFJBTCBTLkEuIiB+ICJUb3RhbCBBdXN0cmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZW1wcmVzYSkpICU+JSANCiAgc2VsZWN0KGFuaW8sIGVtcHJlc2EsIGlkZW1wcmVzYSwgIGNvbmNlcHRvLA0KICAgICAgICAgY2FudGlkYWRfZXhwbG9yYWNpb24sIGNhbnRpZGFkX2V4cGxvdGFjaW9uLGNhbnRpZGFkX2V4cGxvcmFjaW9uX2NvbXBsZW1lbnRhcmlhLA0KICAgICAgICAgZXhwbG9yYWNpb25fbWlsbG9uZXNfdXNkLGV4cGxvdGFjaW9uX21pbGxvbmVzX3VzZCwgZXhwbG9yYWNpb25fY29tcGxfbWlsbG9uZXNfdXNkICkgJT4lIA0KICAjIGZpbHRlcihzdHJfZGV0ZWN0KGNvbmNlcHRvLCAncG96bycpKSAlPiUNCiAgZ3JvdXBfYnkoZW1wcmVzYSwgYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoaW52ZXJzaW9uX2V4cGxvdGFjaW9uID0gc3VtKGV4cGxvdGFjaW9uX21pbGxvbmVzX3VzZCwgbmEucm0gPSBUKSkgJT4lIA0KICBhcnJhbmdlKC1pbnZlcnNpb25fZXhwbG90YWNpb24pICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiKQ0KaW52ZXJzaW9uZXNfYW5pb19hbnRlcmlvcg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnJlc29sdWNpbl8yMDU3X2ludmVyc2lvbmVzX3JlYWxpemFkYXNfbWVuc3VhbCA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9JbnZlcnNpb24vU2VjcmV0YXJpYSBkZSBFbmVyZ2lhL3Jlc29sdWNpbi0yMDU3LWludmVyc2lvbmVzLXJlYWxpemFkYXMtbWVuc3VhbC5jc3YiKQ0KDQpyZXNvbHVjaW5fMjA1N19pbnZlcnNpb25lc19maW5fY29uY2VzaW9uPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvSW52ZXJzaW9uL1NlY3JldGFyaWEgZGUgRW5lcmdpYS9yZXNvbHVjaW4tMjA1Ny1pbnZlcnNpb25lcy1yZWFsaXphZGFzLWZpbi1kZS1jb25jZXNpbi5jc3YiKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmludmVyc2lvbmVzXzIwMDVfMjAxMiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0ludmVyc2lvbi9TZWNyZXRhcmlhIGRlIEVuZXJnaWEvdGFibGFzIGRpbmFtaWNhcy9pbnZlcnNpb25lc18yMDA1XzIwMTIueGxzeCIsIA0KICAgIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIpLCANCiAgICBza2lwID0gOCkgJT4lIA0KICByZW5hbWUocGxhbl8xcmFfc2VtYW5hID0gIlBsYW4gMcKqIFNlbS4iLA0KICAgICAgICAgcGxhbl9hbnVhbCA9ICJQbGFuIEFudWFsIiwNCiAgICAgICAgIHJlYWxpemFkb19hbnVhbCA9ICJSZWFsaXphZG8gQW51YWwiLA0KICAgICAgICAgY29uY2VwdG8gPSBDb25jZXB0bykgJT4lIA0KICBtdXRhdGUoYW5pbyA9ICB6b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBlbXByZXNhID0gIHpvbzo6bmEubG9jZihlbXByZXNhKSwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiLA0KICAgICAgICAgZW1wcmVzYSA9Y2FzZV93aGVuKGVtcHJlc2EgPT0gIllQRiBTLkEuIiB+ICJZUEYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgKFNVQ1VSU0FMIEFSR0VOVElOQSkgTExDIiB+ICJQQUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgU0wiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUEVUUk9CUkFTIEFSR0VOVElOQSBTLkEuIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBFU0EgKFBFVFJPQlJBUyBFLlMuQS4pIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIkVOQVAgU0lQRVRST0wgQVJHRU5USU5BIFMuQS4iIH4gIkVOQVAgU0lQRVRST0wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0FVIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlNJTk9QRUMgQVJHRU5USU5BIEVYUExPUkFUSU9OIEFORCBQUk9EVUNUSU9OLCBJTkMuIiB+ICJTaW5vcGVjIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJURUNQRVRST0wgUy5BLiIgfiAiVGVjcGV0cm9sIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUExVU1BFVFJPTCBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQTFVTUEVUUk9MIEVORVJHWSBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJDT01QQcORw41BIEdFTkVSQUwgREUgQ09NQlVTVElCTEVTIFMuQS4iIH4gIkNHQyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiV0lOVEVSU0hBTEwgRU5FUkdJQSBTLkEuIiB+ICJXaW50ZXJzaGFsbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiWVNVUiBFTkVSR8ONQSBBUkdFTlRJTkEgUy5SLkwuIiB+ICJZU1VSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJZU1VSIFBFVFJPTEVSQSBBUkdFTlRJTkEgUy5BLiIgfiAiWVNVUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVE9UQUwgQVVTVFJBTCBTLkEuIiB+ICJUb3RhbCBBdXN0cmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZW1wcmVzYSkpICU+JSANCiAgZmlsdGVyKCEoZW1wcmVzYSAlaW4lIGMoIk8mRyBERVZFTE9QTUVOVFMgTFREIFMuQS4iICwiUEVUUk9NSU5FUkEgQ0hVQlVUIFMuRS4iKSkpICU+JQ0KICAjIGZpbHRlcihzdHJfZGV0ZWN0KGNvbmNlcHRvLCAncG96bycpKSAlPiUNCiAgZ3JvdXBfYnkoZW1wcmVzYSwgYW5pbywgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZShpbnZlcnNpb25fYW51YWwgPSBzdW0ocmVhbGl6YWRvX2FudWFsLCBuYS5ybSA9IFQpKSAlPiUgDQogIGFycmFuZ2UoLWludmVyc2lvbl9hbnVhbCkNCmludmVyc2lvbmVzXzIwMDVfMjAxMg0KDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmdyYWZfaW52ZXJzaW9uZXNfMjAwNV8yMDEyIDwtICBpbnZlcnNpb25lc18yMDA1XzIwMTIgJT4lDQogIGdncGxvdChhZXMoYW5pbywgaW52ZXJzaW9uX2FudWFsLCBjb2xvciA9IGVtcHJlc2EpKSsgDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiSW52ZXJzaW9uZXMgcG9yIGVtcHJlc2EgKHRhYmxhcyBkaW5hbWljYXMpIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJFeHRyYcOtZG8gZGUgdGFibGFzIGRpbsOhbWljYXMiLA0KICAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIsDQogICAgICAgY2FwdGlvbiA9ICJTZWNyZXRhcmlhIGRlIEVuZXJnw61hIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmdncGxvdGx5KGdyYWZfaW52ZXJzaW9uZXNfMjAwNV8yMDEyLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KDQpncmFmX2ludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IgPC0gIGludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IgJT4lDQogIGdncGxvdChhZXMoYW5pbywgaW52ZXJzaW9uX2V4cGxvdGFjaW9uLCBjb2xvciA9IGVtcHJlc2EpKSsgDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiSW52ZXJzaW9uZXMgcG9yIGVtcHJlc2EgKGHDsW8gYW50ZXJpb3IpIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJJbnZlcnNpb25lcyBhw7FvIGFudGVyaW9yIiwNCiAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiLA0KICAgICAgIGNhcHRpb24gPSAiU2VjcmV0YXJpYSBkZSBFbmVyZ8OtYSIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpnZ3Bsb3RseShncmFmX2ludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA0NTApDQoNCmBgYA0KDQoNCiMjIyBBbsOhbGlzaXMgZGUgY29ycmVsYWNpw7NuIGVudHJlIEludmVyc2nDs24geSBQb3pvcw0KDQotIGJ1c2NhciBjb3JyZWxhY2lvbiwgcGFyYSB2ZXIgc2kgbGEgc2VyaWUgZGUgaW52ZXJzacOzbiBzZSBtdWV2ZSBzaW1pbGFyIGEgbG9zIHBvem9zDQotIHVzYXIgc3RvY2sgeSBhZGVtYXMgdXNhciB2YXJpYWNpb24gZGUgc3RvY2sgKGJzIGRlIHVzbykNCg0KQ29uIHBvem9zIGRlIElBUEcNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIGNvbiBpbnZlcnNpb25lcyByZWFsaXphZGFzIGHDsW8gYW50ZXJpb3INCmludmVyc2lvbl9wb3pvcyA8LSBwb3pvc19pYXBnICU+JSANCiAgbGVmdF9qb2luKGludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IgJT4lDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSwgYnkgPSBjKCJlbXByZXNhIiwgImFuaW8iKSkgJT4lIA0KICBtdXRhdGUoaW52ZXJzaW9uX3Bvcl9wb3pvID0gaW52ZXJzaW9uX2V4cGxvdGFjaW9uIC90b3RhbF9wb3pvcykNCg0KI2NvbiBpbnZlcnNpb25lcyBhbnVuY2lhZGFzDQppbnZlcnNpb25fcG96b3NfMiA8LSBwb3pvc19pYXBnICU+JSANCiAgbGVmdF9qb2luKGludmVyc2lvbmVzXzIwMDVfMjAxMiAlPiUNCiAgICAgICAgICAgICAgdW5ncm91cCgpLCBieSA9IGMoImVtcHJlc2EiLCAiYW5pbyIpKSAlPiUgDQogIG11dGF0ZShpbnZlcnNpb25fcG9yX3Bvem8gPSBpbnZlcnNpb25fYW51YWwgL3RvdGFsX3Bvem9zKQ0KDQojZXN0YSBtYWwgcHEgZXMgZmx1am8gZGUgcG96b3MgdnMgc3RvY2sgZGUgY2FwaXRhbA0KIyBrdGFfcG96b3MgPC0gcG96b3NfaWFwZyAlPiUgDQojICAgbGVmdF9qb2luKHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JQ0KIyAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgDQojICAgICAgICAgICAgICAgc2VsZWN0KC1zZWN0b3IpLCBieSA9IGMoImVtcHJlc2EiLCAiYW5pbyIpKSAlPiUgDQojICAgbXV0YXRlKHBweWVfcG9yX3Bvem8gPSBwcm9wX3BsYW50X2VxdWlwIC90b3RhbF9wb3pvcykNCg0KDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ3JhZl9pbnZlcnNpb25fcG96byA8LSBpbnZlcnNpb25fcG96b3MgJT4lIA0KICBmaWx0ZXIoIGFuaW8gPj0gMjAxMikgJT4lDQogIGdncGxvdChhZXMoYW5pbyxpbnZlcnNpb25fcG9yX3Bvem8sIGNvbG9yID0gZW1wcmVzYSApKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpb25lcyBhw7FvIGFudGVyaW9yIHNvYnJlIHBvem9zIElBUEciLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkNCmdncGxvdGx5KGdyYWZfaW52ZXJzaW9uX3Bvem8sIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQoNCmdyYWZfaW52ZXJzaW9uX3Bvem9fMiA8LSBpbnZlcnNpb25fcG96b3NfMiAlPiUgDQogIGZpbHRlciggYW5pbyA8PSAyMDEyKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLGludmVyc2lvbl9wb3JfcG96bywgY29sb3IgPSBlbXByZXNhICkpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlID0gIkludmVyc2lvbmVzIHJlYWxpemFkYXMgc29icmUgcG96b3MgSUFQRyIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQogIHRoZW1lX2NsYXNzaWMoKQ0KZ2dwbG90bHkoZ3JhZl9pbnZlcnNpb25fcG96b18yLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCkNvbiBwb3pvcyBDYXAgSVYNCmBgYHtyIGVjaG89RkFMU0V9DQojIGNvbiBpbnZlcnNpb25lcyByZWFsaXphZGFzIGHDsW8gYW50ZXJpb3INCmludmVyc2lvbl9wb3pvc19jYXBpdiA8LSBsaXN0YWRvX3Bvem9zICU+JQ0KICByZW5hbWUoYW5pbyA9YW5pb190ZXJtaW5hY2lvbl9wb3pvKSAlPiUgDQogIGxlZnRfam9pbihpbnZlcnNpb25lc19hbmlvX2FudGVyaW9yICU+JQ0KICAgICAgICAgICAgICB1bmdyb3VwKCksIGJ5ID0gYygiZW1wcmVzYSIsICJhbmlvIiApKSAlPiUNCiAgbXV0YXRlKGludmVyc2lvbl9wb3JfcG96byA9IGludmVyc2lvbl9leHBsb3RhY2lvbiAvcG96b3MpDQoNCmdyYWZfaW52ZXJzaW9uX3Bvem8gPC0gaW52ZXJzaW9uX3Bvem9zX2NhcGl2ICU+JSANCiAgZmlsdGVyKCBhbmlvID49IDIwMTIpICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8saW52ZXJzaW9uX3Bvcl9wb3pvLCBjb2xvciA9IGVtcHJlc2EgKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiSW52ZXJzaW9uZXMgYcOxbyBhbnRlcmlvciBzb2JyZSBwb3pvcyBDYXBpdHVsbyBJViIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KZ2dwbG90bHkoZ3JhZl9pbnZlcnNpb25fcG96bywgd2lkdGggPSA3MDAsIGhlaWdodCA9IDQwMCkNCg0KDQpgYGANCg0KIyMgUmVnYWzDrWFzDQoNCiogRnVlbnRlczogDQogICsgU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgKEJhc2UgUmVnYWzDrWFzKQ0KDQoNClJFVklTQVIgRUwgQ0FMQ1VMTyBERSBCRVRBTklBIA0KY3VhbnRvIGdhbmFyaWFuIGxhcyBwcm92aW5jaWFzIHNpIGVsIHByZWNpbyBkZWwgbWVyY2FkbyBpbnRlcm5vIHNlIGFjb21vZGEgYWwgaW50ZXJuYWNpb25hbD8NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNyZWdhbGlhcw0KI2ZpbHRybyBjb24gcHJvZHVjdG9zDQpwcm9kdWN0b3MgPC0gbGlzdCgiY3J1ZG8iLCAiZ2FzIiwgImdhc29saW5hIiwgImdscCIpDQoNCiNsb29wIHBhcmEgbGV2YW50YXIgbGFzIGJhc2VzDQpsaXN0YV9yZWdhbGlhcyA9IGxpc3QoKQ0KZm9yKGkgaW4gcHJvZHVjdG9zKXsNCiAgcmVnYWxpYXNfaSA8LSByZWFkX2RlbGltKHBhc3RlMCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9yZWdhbGlhc18iLCBpLCAiLmNzdiIpLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUsIA0KICAgIHNraXAgPSAxKQ0KICBsaXN0YV9yZWdhbGlhc1tbaV1dIDwtIHJlZ2FsaWFzX2kNCn0NCg0KI2Jhc2VzIGluZGl2aWR1YWxlcw0KcmVnYWxpYXNfY3J1ZG8gPC0gbGlzdGFfcmVnYWxpYXMkY3J1ZG8gJT4lIA0KICBtdXRhdGUobW9uZWRhID0gIlVTRCIsDQogICAgICAgICBwcm9kdWN0byA9ICJjcnVkbyIpDQpyZWdhbGlhc19nYXMgPC0gbGlzdGFfcmVnYWxpYXMkZ2FzICU+JSANCiAgbXV0YXRlKG1vbmVkYSA9ICJhcnMiLA0KICAgICAgICAgcHJvZHVjdG8gPSAiZ2FzIikNCnJlZ2FsaWFzX2dhc29saW5hIDwtIGxpc3RhX3JlZ2FsaWFzJGdhc29saW5hICU+JSANCiAgbXV0YXRlKG1vbmVkYSA9ICJVU0QiLA0KICAgICAgICAgcHJvZHVjdG8gPSAiZ2Fzb2xpbmEiKQ0KcmVnYWxpYXNfZ2xwIDwtIGxpc3RhX3JlZ2FsaWFzJGdscCAlPiUgDQogIG11dGF0ZShtb25lZGEgPSAiYXJzIiwNCiAgICAgICAgIHByb2R1Y3RvID0gImdscCIpDQoNCiNiYXNlIGNvbXBsZXRhDQpyZWdhbGlhcyA8LSAgcmVnYWxpYXNfY3J1ZG8gJT4lIA0KICBiaW5kX3Jvd3MocmVnYWxpYXNfZ2FzLCByZWdhbGlhc19nYXNvbGluYSwgcmVnYWxpYXNfZ2xwKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDkU8iLA0KICAgICAgICAgbWVzID0gIk1FUyIsIA0KICAgICAgICAgcmVnYWxpYXNfdG90YWwgPSAiVE9UQUwgUFJPVklOQ0lBIikgJT4lIA0KICBtdXRhdGUoZmVjaGEgPSBhcy5EYXRlKHBhcnNlX2RhdGVfdGltZShwYXN0ZTAoYW5pbywgbWVzKSwgb3JkZXJzID0gInltIikpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgYW5pbywgbWVzLCBwcm9kdWN0bywgbW9uZWRhLCByZWdhbGlhc190b3RhbCwgZXZlcnl0aGluZyguKSkgJT4lIA0KICBncm91cF9ieShwcm9kdWN0bywgYW5pbywgbW9uZWRhICkgJT4lIA0KICBzdW1tYXJpc2UocmVnYWxpYXNfdG90YWwgPSBzdW0ocmVnYWxpYXNfdG90YWwpKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWwgJT4lIHNlbGVjdCgtVENQKSkgJT4lIA0KICBtdXRhdGUocmVnYWxpYXNfdG90YWwgPSBjYXNlX3doZW4obW9uZWRhID09ICJVU0QiIH4gcmVnYWxpYXNfdG90YWwgKiBUQ0MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcmVnYWxpYXNfdG90YWwpLA0KICAgICAgICAgdW5pZGFkID0gImFycyIpICU+JSANCiAgc2VsZWN0KC1jKFRDQywgbW9uZWRhKSkNCg0KcmVnYWxpYXMNCg0KcmVnYWxpYXNfdXNkIDwtIHJlZ2FsaWFzICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSBzZWxlY3QoYW5pbywgdGNjKSkgJT4lIA0KICBtdXRhdGUocmVnYWxpYXMgPSByZWdhbGlhc190b3RhbCAvdGNjLCANCiAgICAgICAgIHVuaWRhZCA9ICJVU0QiKSAlPiUgDQogIHNlbGVjdCgtYyhyZWdhbGlhc190b3RhbCwgdGNjKSkNCg0KYGBgDQoNCiMjIFN1YnNpZGlvcw0KYGBge3J9DQojIENFRklQIGNvbnQgZXQgYWwuIFN1YnNpZGlvcyBjb21vICUgZGVsIFBCSQ0Kc3Vic2lkaW9zX2NlZmlwIDwtIHJlYWRfZXhjZWwoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL3N1YnNpZGlvcy9zdWJzaWRpb3MueGxzeCIpICU+JSANCiAgZ2F0aGVyKGtleSA9IGFuaW8sDQogICAgICAgICB2YWx1ZSA9IHN1YnNpZGlvc19wb3JjZW50YWplX3BiaSwNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICVpbiUgYygiQ0FNTUVTQSIsICJQbGFuIEdhcyIsIkVOQVJTQSIsICJTdWJzaWRpb3MgRkYgR04geSBHTFAiKSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkgJT4lIA0KICBsZWZ0X2pvaW4oZ2FuYW5jaWFfeV9wYmkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcGJpKSkgJT4lDQogIG11dGF0ZShzdWJzaWRpb3NfcG9yY2VudGFqZV9wYmk9YXMuZG91YmxlKHN1YnNpZGlvc19wb3JjZW50YWplX3BiaSksDQogICAgICAgICBzdWJzaWRpb3NfY2VmaXAgPSBzdWJzaWRpb3NfcG9yY2VudGFqZV9wYmkgKiBwYmkgKiAxMF42KSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHVuaWRhZCA9ICJQZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgICAgIHN1YnNpZGlvc19jZWZpcD1zdW0oc3Vic2lkaW9zX2NlZmlwLCBuYS5ybSA9IFQpKQ0KDQojZWplcyANCnN1YnNpZGlvc19lamVzIDwtIHJlYWRfZXhjZWwoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL3N1YnNpZGlvcy54bHN4IiApICU+JSANCiAgcmVuYW1lKHN1YnNpZGlvc191c2QgPSBzdWJzaWRpb3NfaGlkcm9jYXJidXJvcykgJT4lIA0KICByaWdodF9qb2luKHRjcF9hbnVhbF9iICU+JSANCiAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB0Y2MpLCBieSA9ICJhbmlvIikgJT4lDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHVuaWRhZCA9ICJQZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIHN1YnNpZGlvc19lamVzID0gc3Vic2lkaW9zX3VzZCp0Y2MqMTBeNikNCg0Kc3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MgPC0gc3Vic2lkaW9zX2VqZXMlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHN1YnNpZGlvc19lamVzKSAlPiUgDQogIGZ1bGxfam9pbihzdWJzaWRpb3NfY2VmaXAsIGJ5ID1jKCJhbmlvIiwgInVuaWRhZCIpKSAlPiUgDQogIGFycmFuZ2UoLWFuaW8pICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJQZXNvcyBjb3JyaWVudGVzIikNCiAgICAgICAgICMgeCA9IHN1YnNpZGlvc19jZWZpcC9zdWJzaWRpb3NfZWplcykNCnN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zICANCmBgYA0KDQoNCg0KIyBWYWxvciB0b3RhbCBkZSBsYSBwcm9kdWNjacOzbiAgDQoNCg0KIyMgQ3JpdGVyaW9zIG1ldG9kb2zDs2dpY29zIA0KU2UgcHJlc2VudGFuIGEgY29udGludWFjacOzbiBkaXN0aW50YXMgZXN0aW1hY2lvbmVzIHNvYnJlIGxhIG1hZ25pdHVkIGRlIHJpcXVlemEgcHJlc2VudGUgZW4gZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvOiBWYWxvciBCcnV0byB5IEFncmVnYWRvIGRlIFByb2R1Y2Npw7NuIChWQlAgeSBWQSksIENvbnN1bW8gSW50ZXJlbWVkaW8gKENJKSwgTWFzYSBTYWxhcmlhbCAoTVMpIHkgRXhjZWRlbnRlIEJydXRvIGRlIEV4cGxvdGFjacOzbiAoRUJFKS4gRWwgVkJQIHN1cmdlIGRlIGxhIHZhbHVhY2nDs24gZGUgbGEgcHJvZHVjY2nDs24gYSBzdXMgcHJlY2lvcyBjb3JyZXNwb25kaWVudGVzLiBFbCBWQSByZXN1bHRhIGRlIGxhIGRpZmVyZW5jaWEgZW50cmUgZWwgVkJQIHkgQ0ksIGVsIGN1YWwgcHVlZGUgc3VyZ2lyIG9yaWdpbmFsbWVudGUgZGUgZXN0YSByZXN0YSBvIGEgcGFydGlyIGRlbCBjb2VmaWNpZW50ZSB0w6ljbmljbyBkZSBsYSBNYXRyaXogSW5zdW1vIFByb2R1Y3RvIChNSVApLiBFbCBFQkUgY29uc3RpdHV5ZSBsYSBwbHVzdmFsw61hIChQVikgdG90YWwgZGUgbGEgcmFtYSwgZXMgZGVjaXIsIGxhIHN1bWEgZGUgbGEgcmVudGEgZGUgbGEgdGllcnJhIChSVCkgbcOhcyBsYSBnYW5hbmNpYSBub3JtYWwgKEdub3JtKSwgeSBzZSBvYnRpZW5lIGx1ZWdvIGRlIGRlc2NvbnRhciBsYSBNUyB5IGxvcyBpbXB1ZXN0b3MgZXNwZWPDrWZpY29zIChJbXApIGRlbCBWQS4gRW4gdG9kb3MgbG9zIGNhc29zIHF1ZSBzZSBwcmVzZW50YXLDoW4gYSBjb250aW51YWNpw7NuLCBsb3MgSW1wIHNlIGNhbGN1bGFyb24gYSBwYXJ0aXIgZGUgYXBsaWNhciBzb2JyZSBlbCBWQlAgdW4gY29lZmljaWVudGUgIHJlc3VsdGFudGUgZGVsIHBlc28gZGUgbG9zIGltcHVlc3RvcyBwcm9tZWRpbyBkZSBsYSAgTUlQIGRlIDE5OTcuIExvIG1pc21vIHBhc2EgY29uIGxhIGVzdGltYWNpw7NuIGRlIGxhIGRlcHJlY2lhY2nDs24gZGUgY2FwaXRhbCBvIGNvbnN1bW8gZGUgY2FwaXRhbCBmaWpvIChDb25zS2Zpam8pLCBxdWUgc2Ugb2J0aWVuZSBhIHBhcnRpciBkZSBhcGxpY2FyIGxhIHRhc2EgZGUgZGVwcmVjaWFjacOzbiBwcm9tZWRpbyByZXN1bHRhbnRlIGRlIGxvcyBiYWxhbmNlcyBkZSBZUEYgKDE5OTggLSAyMDE4KSBzb2JyZSBlbCB0b3RhbCBkZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyAoUFB5RSkgZGUgbGEgcmFtYS4gRXN0YSBwYXJ0aWRhIHNlIGFwbGljYSBwYXJhIG9idGVuZXIgZWwgRXhjZWRlbnRlIE5ldG8gZGUgRXhwbG90YWNpw7NuLiBTZSBwcmVzZW50YW4gZGlzdGludGFzIGVzdGltYWNpb25lcyBwYXJhIGVsIFZCUCwgQ0kgeSBNUywgcXVlIGx1ZWdvIHNlIG9ic2VydmFyw6FuIGVuIGxhIGZvcm11bGFjacOzbiBtYXRlbcOhdGljYToNCg0KDQoNCiogQ0NOTiAoKmNjbm5fb2ZpY2lhbCopDQogICsgVmFsb3JlcyBjb250YWJsZXMgb2ZpY2lhbGVzIGRlIGxhcyBDdWVudGFzIE5hY2lvbmFsZXMgKHPDs2xvIGRpc3BvbmlibGUgcGFyYSBlbCBwZXLDrW9kbyAyMDA0LTIwMTIpLiBEYWRvIHF1ZSBzZSBwcmVzZW50YW4gc2VyaWVzIGRlIFZCUCB5IFZBLCBzZSBwdWRvIGVzdGltYXIgZWwgQ0kgY29tbyBsYSBkaWZlcmVuY2lhIGRlIGRpY2hhcyBjdWVudGFzLiBTZSBwcm9jZWRpw7MgYSBzZXBhcmFyIGVsIFZCUCBhIHBhcnRpciBkZWwgcGVzbyBkZWwgVkJQIGRlIGxvcyBzZXJ2aWNpb3MgZGUgYXBveW8gYSBsYSBleHRyYWNjacOzbiBzb2JyZSBlbCBWQlAgZGUgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzLCBwcmVzZW50ZSBlbiBlbCBDdWFkcm8gZGUgVXRpbGl6YWNpw7NuIGRlIE9mZXJ0YSAoQ09VKSBkZSAyMDA0IGRlIElOREVDLiBTZSBkZXNjb250w7MgZXN0YSBwcm9wb3JjacOzbiAocmVzdWx0YW50ZSBkZWwgMTAsNyUpIGRlbCBWQlAgdG90YWwgcGFyYSBvYnRlbmVyIHVuIFZCUCBzw7NsbyBkZSBleHRyYWNjacOzbi4gRGFkbyBxdWUgc2UgcG9zZWUgaW5mb3JtYWNpw7NuIGRlbCBzYWxhcmlvIHByb21lZGlvIGRlbCBzZWN0b3IgeSBlbCBlbXBsZW8sIHNlIHB1ZG8gb2J0ZW5lciBsYSBNUyByZXN1bHRhbnRlLCB0YW50byBwYXJhIGVsIHRvdGFsIGRlbCBzZWN0b3IgKGV4dHJhY2Npw7NuIHkgc2VydmljaW9zIHJlbGFjaW9uYWRvcykgY29tbyBwYXJhIHPDs2xvIGV4dHJhY2Npw7NuLiBBIHBhcnRpciBkZSBlc3RvcyBkYXRvcyBzZSBlbGFib3LDsyB1biBjb2VmaWNpZW50ZSBxdWUgcmVmbGVqYSBlbCBwcm9tZWRpbyBkZSBsYSBwcm9wb3JjacOzbiBkZSBsYSBNUyBzb2JyZSBlbCBWQlAgcXVlIHNlIHV0aWxpemFyw6EgZW4gY8OhbGN1bG9zIHBvc3RlcmlvcmVzIGRlIE1TIHRvdGFsIHkgTVMgZGUgZXh0cmFjY2nDs24uIA0KDQoqIEVzdGltYWNpw7NuIHByb3BpYSBjb24gY3JpdGVyaW8gQ0NOTiAoKnZicF92YV9jaV9wcm9waWEqKQ0KICArIEVzdGltYWNpw7NuIHByb3BpYSBkZSBsb3MgdmFsb3JlcyBjb250YWJsZXMgYSBwYXJ0aXIgZGUgbGFzIGZ1ZW50ZXMgcmVjb3BpbGFkYXMsIHNpZ3VpZW5kbyBsb3MgY3JpdGVyaW9zIGRlIGxhcyBDdWVudGFzIE5hY2lvbmFsZXMuIEVzIGRlY2lyLCBwYXJhIG9idGVuZXIgZWwgVkJQIHNlIHZhbHVhIGxhIHByb2R1Y2Npw7NuIGRlc3RpbmFkYSBhbCBtZXJjYWRvIGludGVybm8gKHJlc3VsdGFudGUgYSBwYXJ0aXIgZGUgbGEgZGlmZXJlbmNpYSBlbnRyZSBwcm9kdWNjacOzbiB5IGV4cG9ydGFjaW9uZXMpIGNvbiBsb3MgcHJlY2lvcyBpbnRlcm5vcyB5IGxhcyBleHBvcnRhY2lvbmVzIGNvbiBsb3MgcHJlY2lvcyBkZSBleHBvcnRhY2nDs24sIHZhbHVhZG9zIHRpcG8gZGUgY2FtYmlvIGNvbWVyY2lhbCAoVENDKS4gU2UgcHJvY2VkacOzIHRhbWJpw6luIGEgc2VwYXJhciBlbCBWQlAgZGUgZXh0cmFjY2nDs24gbmV0byBkZSBsb3Mgc2VydmljaW9zIHRhbCBjb21vIHNlIGV4cGxpY8OzIGFudGVyaW9ybWVudGUuIEVsIENJIHNlIGVzdGltw7MgYSBwYXJ0aXIgZGUgYXBsaWNhciBlbCBjb2VmaWNpZW50ZSB0w6ljbmljbyAocmF0aW8gQ0kvVkJQKSByZXN1bHRhbnRlIGRlIGxhIE1JUCBkZSAxOTk3IChlcXVpdmFsZW50ZSBhIDAuMjcyKS4gRGUgaWd1YWwgbWFuZXJhLCBwYXJhIGNhbGN1bGFyIGxhIG1hc2Egc2FsYXJpYWwgc2UgYXBsaWPDsyBlbCBjb2VmaWNpZW50ZSBkZSBNUyBtZW5jaW9uYWRvIGFudGVyaW9ybWVudGUuIEZpbmFsbWVudGUsIGNvbW8gc2UgbWVuY2lvbsOzIGFudGVyaW9ybWVudGUsIGVsIFZBIGVsIEVCRSBzZSBjYWxjdWxhcm9uIGEgcGFydGlyIGRlIGxhcyBkaWZlcmVuY2lhcyBtZW5jaW9uYWRhcyBhbnRlcmlvcm1lbnRlLiANCg0KKiBFbXBhbG1lIENDTk4gKCp2YnBfY2NubiopDQogICsgRXN0aW1hY2nDs24gcXVlIHRvbWEgbG9zIHZhbG9yZXMgb2ZpY2lhbGVzIGRlIGxhcyBjdWVudGFzIG5hY2lvbmFsZXMgcGFyYSBlbCBwZXLDrW9kbyBkb25kZSBzZSBwcmVzZW50YW4gZGF0b3MgKDIwMDQgLTIwMTIpIHkgcXVlIGltcHV0YSBsb3MgdmFsb3JlcyBmYWx0YW50ZXMgcG9yIG1lZGlvIGRlIGxhIGV2b2x1Y2nDs24gZGVsIMOtbmRpY2UgZGVsIFZCUCBwcm9waW8gY29uIGNyaXRlcmlvIENDTk4gZXhwbGljYWRvIGFudGVyaW9ybWVudGUuIEFzaW1pc21vLCBzZSB1dGlsaXphcm9uIGxvcyB2YWxvcmVzIG9maWNpYWxlcyBkZSBsYSBNUyBjdWFuZG8gc2UgZW5jb250cmFiYSBkaXNwb25pYmxlIGVsIGRhdG8gKDE5OTYtMjAxOCksIG1pZW50cmFzIHF1ZSBzZSB1dGlsaXrDsyBlbCB2YWxvciBwcm9waW8gZXN0aW1hZG8gY29uIGNyaXRlcmlvIGRlIGxhcyBDQ05OIHBhcmEgbG9zIHJlc3RhbnRlcyBhw7Fvcy4gDQogIA0KKiBDcml0ZXJpbyBQcm9waW8gKCpwdl9oaWRyb2NhcmJ1cm9zX3Byb3BpYSopDQogICsgRXN0aW1hY2nDs24gcHJvcGlhIHF1ZSByZWZsZWphIGNvbiBtYXlvciBwcmVjaXNpw7NuIGVsIHZhbG9yIGRlIGxhIHJpcXVlemEgdG90YWwgcHJlc2VudGUgZW4gZWwgc2VjdG9yLiBFbCBWQlAgc2Ugb2J0aWVuZSBhIHBhcml0ciBkZSB2YWx1YXIgbGEgdG90YWxpZGFkIGRlIGxhIHByb2R1Y2Npw7NuIGEgbG9zIHByZWNpb3MgZXh0ZXJub3MgbyBkZSByZWZlcmVuY2lhIGludGVybmFjaW9uYWwgeSBjb24gZWwgdGlwbyBkZSBjYW1iaW8gZGUgcGFyaWRhZCAoVENQKSwgcXVlIG1pZGUgbGEgY2FwYWNpZGFkIHJlYWwgZGUgY29tcHJhIGRlIGxhIG1vbmVkYSBuYWNpb25hbC4gU2luIGVtYmFyZ28sIGNvbW8gZWwgQ0kgY29uc3RpdHV5ZSBpbnRlcmNhbWJpb3MgZGUgbWVyY2FuY8OtYXMgcmVhbGl6YWRhcyBlbiBlbCDDoW1iaXRvIG5hY2lvbmFsLCBkaWNoYSBwYXJ0aWRhIHNlIG9idGllbmUgYSBwYXJ0aXIgZGUgbG9zIHZhbG9yZXMgb2J0ZW5pZG9zIGVuIGxhIHNlcmllIGRlIGVtcGFsbWUgQ0NOTi4gRGUgaWd1YWwgbWFuZXJhLCBzZSB1dGlsaXrDsyBsYSBNUyByZXN1bHRhbnRlIGRlIGVzdGEgw7psdGltYSBlc3RpbWFjacOzbi4gDQoNCg0KDQoNCiMjIEZvcm11bGFjacOzbiBtYXRlbcOhdGljYSBkZSBlc3RpbWFjaW9uZXMNCg0KVmFsb3IgQnJ1dG8gZGUgUHJvZHVjY2nDs24gdG90YWwsIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBwcm9waW8NCiQkVkJQX3twcm9waWF9ID0gKFBleHRfe3BldHLDs2xlb30gKiBRX3twZXRyw7NsZW99ICsgUGV4dF97Z2FzfSAqIFFfe2dhc30pICogVENQJCQNCg0KRG9uZGU6IA0KDQoqICRWQlBfe3Byb3BpYX0kID0gVmFsb3IgQnJ1dG8gZGUgbGEgUHJvZHVjY2nDs24gdG90YWwsIGVzdGltYWNpw7NuIHByb3BpYQ0KKiAkUGV4dF97cGV0csOzbGVvfSQgPSBQcmVjaW8gZGUgZXhwb3J0YWNpw7NuIG8gcmVmZXJlbmNpYSBpbnRlcm5hY2lvbmFsIGRlbCBwZXRyw7NsZW8gY3J1ZG8gKHNlZ8O6biBjb3JyZXNwb25kYSkNCiogJFBleHRfe2dhc30kID0gUHJlY2lvIGRlIGV4cG9ydGFjacOzbiBvIHJlZmVyZW5jaWEgaW50ZXJuYWNpb25hbCBkZWwgZ2FzIG5hdHVyYWwgKHNlZ8O6biBjb3JyZXNwb25kYSkNCiogJFFfe3BldHLDs2xlb30kID0gQ2FudGlkYWRlcyBwcm9kdWNpZGFzIHRvdGFsZXMgZGUgcGV0csOzbGVvIGNydWRvDQoqICRRX3tnYXN9JCA9IENhbnRpZGFkZXMgcHJvZHVjaWRhcyB0b3RhbGVzIGRlIGdhcyBuYXR1cmFsDQoqICRUQ1AkID0gVGlwbyBkZSBDYW1iaW8gZGUgUGFyaWRhZA0KDQoNClZhbG9yIEJydXRvIGRlIFByb2R1Y2Npw7NuIHRvdGFsLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KJCRWQlBfe0NDTk59ID0gKFBpbnRfe3BldHLDs2xlb30gKiBRTUludF97cGV0csOzbGVvfSArIFBleHRfe3BldHLDs2xlb30gKiBFeHBvX3twZXRyw7NsZW99ICsgUGludF97Z2FzfSAqIFFNSW50X3tnYXN9ICsgUGV4dF97Z2FzfSAqIEV4cG9fe2dhc30pKiBUQ0MkJA0KDQpEb25kZToNCg0KKiAkVkJQX3tDQ05OfSQgPSBWYWxvciBCcnV0byBkZSBsYSBQcm9kdWNjacOzbiB0b3RhbCwgIGVzdGltYWNpw7NuIHByb3BpYSBjb24gY3JpdGVyaW8gZGUgbGFzIENDTk4NCiogJFBpbnRfe3BldHLDs2xlb30kID0gUHJlY2lvIG1lcmNhZG8gaW50ZXJubyBkZWwgcGV0csOzbGVvIGNydWRvDQoqICRQaW50X3tnYXN9JCA9IFByZWNpbyBtZXJjYWRvIGludGVybm8gZGVsIGdhcyBuYXR1cmFsDQoqICRRTUludF97cGV0csOzbGVvfSQgPSBjYW50aWRhZGVzIHZlbmRpZGFzIGFsIG1lcmNhZG8gaW50ZXJubyBkZSBwZXRyw7NsZW8gY3J1ZG8NCiogJFFNSW50X3tnYXN9JCA9IGNhbnRpZGFkZXMgdmVuZGlkYXMgYWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBnYXMgbmF0dXJhbA0KKiAkRXhwb197cGV0csOzbGVvfSQgPSBleHBvcnRhY2lvbmVzIGRlIHBldHLDs2xlbyBjcnVkbw0KKiAkRXhwb197Z2FzfSQgPSBleHBvcnRhY2lvbmVzIGRlIGdhcyBuYXR1cmFsDQoqICRUQ0MkID0gVGlwbyBkZSBDYW1iaW8gQ29tZXJjaWFsDQoNCg0KPGJyPg0KDQpWYWxvciBCcnV0byBkZSBQcm9kdWNjacOzbiBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCg0KJCRWQlBcX2V4dHJfe0NDTk59ID0gVkJQX3tDQ05OfSAqICgxLXByb3BcX3NlcnZpY2lvcykkJA0KDQpEb25kZToNCg0KKiAkVkJQXF9leHRyX3tDQ05OfSQgPSBWYWxvciBCcnV0byBkZSBsYSBQcm9kdWNjacOzbiBleHRyYWNjacOzbiwgIGVzdGltYWNpw7NuIHByb3BpYSBjb24gY3JpdGVyaW8gZGUgbGFzIENDTk4NCiogJHByb3BcX2V4dHIkID0gcHJvcG9yY2nDs24gZGVsIFZCUCBkZSBzZXJ2aWNpb3MgZGUgYXBveW8gc29icmUgVkJQIGRlIGV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyB5IGdhcw0KDQoNClByb3BvcmNpw7NuIGRlIGxvcyBzZXJ2aWNpb3MgZGUgYXBveW8gc29icmUgbGEgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzDQo8YnI+DQokJHByb3BcX3NlcnZpY2lvcyA9IFxmcmFje1ZCUFxfc2VydmljaW9zX3tDT1V9fXtWQlBcX2V4dHJfe0NPVX19JCQNCg0KRG9uZGU6DQoNCiogJFZCUFxfc2VydmljaW9zX3tDT1V9JCA9IFZCUCBkZSBzZXJ2aWNpb3MgZGUgYXBveW8gZGVsIEN1YWRybyBkZSBVdGlsaXphY2nDs24gZGUgT2ZlcnRhDQoqICRWQlBcX2V4dHJhY2Npw7NuX3tDT1V9JCA9IFZCUCBkZSBleHRyYWNjacOzbiBkZSBwZXRyw7NsZW8geSBnYXMgZGVsIEN1YWRybyBkZSBVdGlsaXphY2nDs24gZGUgT2ZlcnRhDQoNCg0KDQo8YnI+DQpDb25zdW1vIEludGVybWVkaW8sIHZhbG9yZXMgb2ZpY2lhbGVzIGRlIGxhcyBDQ05ODQokJCBDSV97Q0NOTn0gPSBWQlBfe0NDTk59IC0gIFZBX3tDQ05OfSAkJA0KDQpEb25kZToNCg0KKiAkQ0lfe0NDTk59JCA9IENvbnN1bW8gSW50ZXJtZWRpbyB0b3RhbCwgZXN0aW1hY2nDs24gcHJvcGlhDQoqICRWQV97Q0NOTn0kID0gVmFsb3IgQWdyZWdhZG8sIGVzdGltYWNpw7NuIGRlIGxhcyBDQ05OIA0KDQo8YnI+DQpDb25zdW1vIEludGVybWVkaW8sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQokJCBDSV97Q0NOTn0gPSBWQlBfe0NDTk59ICogIENvZWZcX3RlYyAkJA0KRG9uZGU6DQoNCiogJENvZWZcX3RlYyQgPSBDb2VmaWNpZW50ZSB0w6ljbmljbyBkZSBNYXRyaXogSW5zdW1vIFByb2R1Y3RvDQoNCjxicj4NCkNvbnN1bW8gSW50ZXJtZWRpbyBkZSBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCg0KJCQgQ0lcX2V4dHJfe0NDTk59ID0gVkJQXF9leHRyX3tDQ05OfSAqICBDb2VmXF90ZWMgJCQNCg0KRG9uZGU6DQoNCiogJCBDSVxfZXh0cl97Q0NOTn0kID0gQ29uc3VtbyBJbnRlcm1lZGlvIGRlIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBjcml0ZXJpbyBDQ05ODQoNCjxicj4NCk1hc2EgU2FsYXJpYWwsIHZhbG9yZXMgb2ZpY2lhbGVzIGRlIGxhcyBDQ05ODQokJE1TID0gVyAqIEVtcCAqIDEzJCQNCkRvbmRlOiANCg0KKiAkTVMkID0gTWFzYSBTYWxhcmlhbCANCiogJFckID0gIFNhbGFyaW8gYW51YWwgcHJvbWVkaW8NCiogJEVtcCQgPSBFbXBsZW8NCg0KPGJyPg0KTWFzYSBTYWxhcmlhbCwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCiQkTVMgPSAgVkJQX3tDQ05OfSAqICBDb2VmXF9NUyQkDQoNCkRvbmRlOiANCg0KKiAkQ29lZlxfTVMkID0gQ29lZmljaWVudGUgZGUgbGEgcHJvcG9yY2nDs24gZGUgTVMgc29icmUgVkJQDQoNCjxicj4NCk1hc2EgU2FsYXJpYWwgZGUgZXh0cmFjY2nDs24sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQokJE1TXF9leHRyID0gIFZCUFxfZXh0cl97Q0NOTn0gKiAgQ29lZlxfTVMkJA0KDQpEb25kZTogDQoNCiAgKiAkTVNcX2V4dHIkID0gTWFzYSBzYWxhcmlhbCBkZWwgc2VjdG9yIGV4dHJhY2Npw7NuDQoNCjxicj4NClZhbG9yIGFncmVnYWRvLCBlc3RpbWFjacOzbiBjcml0ZXJpbyBDQ05ODQokJFZBX3tDQ05OfSAgPSBWQlBfe0NDTk59IOKAkyBDSV97Q0NOTn0gJCQNCkRvbmRlOg0KDQoqICRWQV97Q0NOTn0kID0gVmFsb3IgQWdyZWdhZG8sIGVzdGltYWNpw7NuIHByb3BpYSBjb24gY3JpdGVyaW8gQ0NOTg0KDQo8YnI+DQpWYWxvciBhZ3JlZ2FkbyBkZSBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCiQkVkFcX2V4dHJfe0NDTk59ICA9IFZCUFxfZXh0cl97Q0NOTn0g4oCTIENJXF9leHRyX3tDQ05OfSAkJA0KDQpEb25kZToNCg0KKiAkVkFcX2V4dHJfe0NDTk59JCA9IFZhbG9yIEFncmVnYWRvIGRlIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBwcm9waWEgY29uIGNyaXRlcmlvIENDTk4gDQoNCg0KPGJyPg0KVmFsb3IgYWdyZWdhZG8sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBwcm9waW8NCiQkVkFfe3Byb3BpYX0gID0gVkJQX3twcm9waWF9IOKAkyBDSVxfZXh0cl97Q0NOTn0gJCQNCg0KRG9uZGU6DQoNCiogJFZBX3twcm9waWF9JCA9IFZhbG9yIEFncmVnYWRvLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gcHJvcGlvIA0KDQoNCjxicj4NCg0KRXhjZWRlbnRlIEJydXRvIGRlIEV4cGxvdGFjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCiQkRUJFX3tDQ05OfSAgPSBWQV97Q0NOTn0g4oCTIE1TICAgJCQNCjxicj4NCg0KRXhjZWRlbnRlIEJydXRvIGRlIEV4cGxvdGFjacOzbiBkZSBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCiQkRUJFXF9leHRyX3tDQ05OfSAgPSBWQVxfZXh0cl97Q0NOTn0g4oCTIE1TXF9leHRyICAgJCQNCg0KPGJyPg0KDQpFeGNlZGVudGUgQnJ1dG8gZGUgRXhwbG90YWNpw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gcHJvcGlvDQokJEVCRV97cHJvcGlhfSAgPSBWQV97cHJvcGlhfSDigJMgTVNcX2V4dHIgICAkJA0KDQoNCkRvbmRlOg0KDQoqICRFQkUkID0gRXhjZWRlbnRlIEJydXRvIGRlIEV4cGxvdGFjacOzbg0KKiAkQ0lcX2V4dHJfe0NDTk59JCA9IENvbnN1bW8gaW50ZXJtZWRpbyBkZWwgc2VjdG9yIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KDQoNCjxicj4NCkNvbnN1bW8gZGUgQ2FwaXRhbCBGaWpvLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gcHJvcGlvDQokJENvbktmaWpvID0gUFB5RSAqICBwcm9tKFxmcmFje0RlcH17UFB5RX0pICQkDQoNCkRvbmRlOiANCg0KKiAkQ29uS2Zpam8kID0gQ29uc3VtbyBkZSBDYXBpdGFsIEZpam8NCiogJFBQeUUkPSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyBuZXRhDQoqICRwcm9tKFxmcmFje0RlcH17UFB5RX0pICQgPSAgdGFzYSBkZSBkZXByZWNpYWNpw7NuIHByb21lZGlvDQoqICREZXAkID0gRGVwcmVjaWFjaW9uZXMgKGN1ZW50YSBnYXN0b3MgcG9yIG5hdHVyYWxlemEpDQoNCjxicj4NCg0KUGx1c3ZhbMOtYSAoRXhjZWRlbnRlIE5ldG8gZGUgRXhwbG90YWNpw7NuKSwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIHByb3Bpbw0KJCRQVl97cHJvcGlhfSA9IFZBX3twcm9waWF9IC0gQ29uS2Zpam8gLSBJbXAgJCQNCg0KDQpEb25kZToNCg0KKiAkUFZfe3Byb3BpYX0kID0gUGx1c3ZhbMOtYSAoKkV4Y2VkZW50ZSBOZXRvIGRlIEV4cGxvdGFjacOzbiopDQoqICRJbXAkID0gSW1wdWVzdG9zIG5vcm1hbGVzDQoNCg0KDQojIyBGdWVudGVzIHBhcmEgbGEgY29uc3RydWNjacOzbiBkZSBzZXJpZXMgDQoNCiogUHJvZHVjY2nDs24gZGUgQ3J1ZG86IA0KICArIDE5MTEgYSAxOTkyOiBBbnVhcmlvIGRlIGNvbWJ1c3RpYmxlcyANCiAgKyAxOTkzIC0gYWN0dWFsaWRhZDogU0VTQ08gRG93bnN0cmVhbQ0KICANCiogRXhwb3J0YWNpb25lcyBkZSBDcnVkbzogDQogICsgMTk2MiBhIDE5OTM6IFVOIENvbXRyYWRlIChjbGFzaWZpY2FjacOzbiBTSVRDIGFzIHJlcG9ydGVkKQ0KICArIDE5OTQgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCiAgKyBMb3MgZGF0b3MgZmFsdGFudGVzIGRlIFNFU0NPIHNlIGNvbXBsZXRhcm9uIGNvbiBNRUNPTg0KICArIFNpZ3VlbiBoYWJpZW5kbyBkYXRvcyBmYWx0YW50ZXMgcGFyYSBsb3MgYcOxb3MgMTk2NSwgMTk3MC03NCwgMTk3Ni03OCwgMTk4MC04NA0KICANCiogUHJlY2lvIE1lcmNhZG8gSW50ZXJubyBkZSBDcnVkbzogDQogICsgMTk2MyBhIDE5NjU6IEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRSBhanVzdGFkbyBjb24gZWwgw61uZGljZSBkZWwgcHJlY2lvIGRlbCBBbnVhcmlvIGRlIFlQRiANCiAgKyAxOTg5IGEgMTk5MTogQW51YXJpbyBkZSBZUEYNCiAgKyAxOTY2IGEgMTk4ODogS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFDQogICsgMTk5MjogTUVDT04gYWp1c3RhZG8gY29uIGxhIHZhcmlhY2nDs24gZGVsIMONbmRpY2UgZGUgcHJlY2lvcyBpbnRlcm5vcyBhbCBwb3IgbWF5b3IgKElQSU0pDQogICsgMTk5MyBlbiBhZGVsYW50ZTogTUVDT04gDQogIA0KKiBQcmVjaW8gTWVyY2FkbyBFeHRlcm5vIENydWRvOg0KICArIGVudHJlIDE5NjIgeSAxOTkyOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBVTiBDb210cmFkZQ0KICArIGVudHJlIDE5OTMtMjAwMSB5IDIwMDQtMjAxNDogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgTWVjb24NCiAgKyBlbnRyZSAyMDAyIHkgMjAwMzogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBkZSBBcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUgKENsYXNpZmljYWNpw7NuIEhTIGFzIHJlcG9ydGVkKSAgDQogICsgMjAxNCBlbiBhZGVsYW50ZTogcHJlY2lvIGRlIGV4cG9ydGFjacOzbiBhcmdlbnRpbmEgZGUgU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgKFJlZ2Fsw61hcykNCiAgKyBWYWxvcmVzIGZhbHRhbnRlcyBwcmV2aW9zIGEgMTk5MjogQnJlbnQgIChGdWVudGU6IEluZmxhdGlvbiBEYXRhKQ0KICANCiogUHJvZHVjY2nDs24gZGUgR2FzOg0KICArIDE5MTEgYSAxOTkyOiBBbnVhcmlvIGRlIGNvbWJ1c3RpYmxlcyANCiAgKyAxOTkzIGVuIGFkZWxhbnRlOiBTRVNDTyBEb3duc3RyZWFtDQogIA0KKiBFeHBvcnRhY2lvbmVzIGRlIGdhczogDQogICsgMTk2MiBhIDE5OTY6IFVOIENvbXRyYWRlLA0KICArIDE5OTcgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCiAgKyBEYXRvcyBmYWx0YW50ZXMgcGFyYSBsb3MgYcOxb3MgMTk5OSB5IDIwMDANCiAgDQoqIFByZWNpbyBNZXJjYWRvIEludGVybm8gZGUgZ2FzOg0KICArIDE5NjMgLSAxOTY5ICYgMTk4OSAtIDE5OTI6IEFudWFyaW8gZGUgWVBGDQogICsgMTk3MCAtIDE5ODg6ICBLb3p1bGogeSBQaXN0b25lc2kgLSBSZXZpc3RhIElERUUNCiAgKyAxOTkzIGVuIGFkZWxhbnRlOiBTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAtIEJhc2UgUmVnYWzDrWFzDQogICsgRWwgZGF0byBkZWwgYcOxbyAxOTkyIHNlIGRpdmlkacOzIHBvciAxMCwgZGFkbyBxdWUgcmVzdWx0YWJhIGV4Y2VzaXZhbWVudGUgYWx0bywgbG8gY3VhbCBlcyBtZXRvZG9sw7NnaWNhbWVudGUgaW5hY2VwdGFibGUgcGVybyBzaXJ2ZSBkZSBlamVyY2ljaW8uIA0KICANCiogUHJlY2lvIE1lcmNhZG8gRXh0ZXJubzoNCiAgKyBBw7FvcyAxOTY0IHkgMTk2NTogUHJlY2lvIGRlIGltcG9ydGFjacOzbiBkZSBnYXMgcHJvdmVuaWVudGUgZGUgQm9saXZpYSBoYWNpYSBBcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUNCiAgKyAxOTY2IGVuIGFkZWxhbnRlOiBQcmVjaW8gZGUgZXhwb3J0YWNpb24gZGUgZ2FzIGRlc2RlIEJvbGl2aWEgYSBBcmdlbnRpbmEgZGUgVU4gQ29tdHJhZGUNCiAgKyBEYXRvcyBmYWx0YW50ZXMgcGFyYSBsb3MgYcOxb3MgcHJldmlvcyBhIDE5NjMgeSBwZXLDrW9kbyAxOTY4LTE5NzEgDQoNCiogVmFsb3IgQnJ1dG8gZGUgbGEgUHJvZHVjY2nDs24sIFZhbG9yIEFncmVnYWRvIHkgQ29uc3VtbyBJbnRlcm1lZGlvOg0KICArIElOREVDIC0gRGlyZWNjacOzbiBOYWNpb25hbCBkZSBDdWVudGFzIE5hY2lvbmFsZXMgKEJhc2UgTWluZXLDrWEgZSBIaWRyb2NhcmJ1cm9zIGRlIGxhcyBDdWVudGFzIE5hY2lvbmFsZXMpLiBMYXMgdmFyaWFibGVzICJleHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MiIHJlZmllcmVuIGEgIkV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkbyB5IGdhcyBuYXR1cmFsLiBBY3RpdmlkYWRlcyBkZSBzZXJ2aWNpb3MgcmVsYWNpb25hZGFzIGNvbiBsYSBleHRyYWNjacOzbiBkZSBwZXRyw7NsZW8geSBnYXMsIGV4Y2VwdG8gbGFzIGFjdGl2aWRhZGVzIGRlIHByb3NwZWNjacOzbiINCiAgKyBDw6FsY3VsbyBwcm9waW8gZGVsIFZCUCBjb24gZGF0b3MgZGF0b3MgZGUgcHJvZHVjY2nDs24geSBwcmVjaW8gaW50ZXJuYWNpb25hbCByZWNvcGlsYWRvcy4gTGFzIGZ1ZW50ZXMgc29uIGxhcyBzaWd1aWVudGVzIChsb3MgY3JpdGVyaW9zIHNvbiBsb3MgbWlzbW9zIHBhcmEgbGEgdXRpbGl6YWNpw7NuIHBvc3RlcmlvciBlbiBlbCBjw6FsY3VsbyBkZSByZW50YSBkZSBsYSB0aWVycmEgaGlkcm9jYXJidXLDrWZlcmEgcG9yIGRpZmVyZW5jaWFsIGRlIHByZWNpb3MsIHNvYnJldmFsdWFjacOzbiBjYW1iaWFyaWEgeSBvdHJvcyBtZWNhbmlzbW9zKQ0KDQoqIFNhbGFyaW8geSBlbXBsZW8NCiAgKyAxOTYwLTE5OTY6IGVzdGltYWNpw7NuIGEgcGFydGlyIGRlIGFwbGljYWNpw7NuIGRlbCBjb2VmaWNpZW50ZSBkZSBwcm9wb3JjacOzbiBkZSBsYSBtYXNhIHNhbGFyaWFsIHNvYnJlIGVsIFZCUA0KICArIDE5OTYgZW4gYWRlbGFudGU6IE1pbmlzdGVyaW8gZGUgVHJhYmFqbywgRW1wbGVvIHkgU2VndXJpZGFkIFNvY2lhbCAtIE9ic2VydmF0b3JpbyBkZSBFbXBsZW8geSBEaW7DoW1pY2EgRW1wcmVzYXJpYWwgKE9FREUpDQoNCiogQ29uc3VtbyBkZSBjYXBpdGFsIGZpam8NCiAgKyBDb2VmaWNpZW50ZSBkZSBkZXByZWNpYWNpw7NuIGVzdGltYWRvIGEgcGFydGlyIGRlIEVzdGFkb3MgQ29udGFibGVzIGRlIFlQRiAoMTk5OC0yMDE4KQ0KPGJyPg0KDQoNCg0KIyMjIEN1ZW50YXMgTmFjaW9uYWxlcw0KDQpbUHJvZHVjdG8gSW50ZXJubyBCcnV0byBFeHBsb3RhY2nDs24gTWluYXMgeSBDYW50ZXJhcyBNaWxsb25lcyBkZSBwZXNvcyBjb25zdGFudGVzLiBCYXNlIDE5NjAuIFZhbG9yZXMgdHJpbWVzdHJhbGVzDQpQSUIgRXhwbG90YWNpw7NuIE1pbmFzIHkgQ2FudGVyYXMgZW4gbWlsbG9uZXMgZGUgcGVzb3MgZGUgMTk2MC4gMTk3MC0xOTgwXShodHRwczovL2RhdG9zLmdvYi5hci9kYXRhc2V0L3NzcG0tcHJvZHVjdG8taW50ZXJuby1icnV0by1zZWN0b3JpYWwtMTk3MC0xOTgwKQ0KDQoNCltQcm9kdWN0byBJbnRlcm5vIEJydXRvIEV4cGxvdGFjacOzbiBNaW5hcyB5IENhbnRlcmFzLCBBdXN0cmFsZXMgY29uc3RhbnRlcy4gQmFzZSAxOTcwLlZhbG9yZXMgdHJpbWVzdHJhbGVzDQpQSUIgRXhwbG90YWNpw7NuIE1pbmFzIHkgQ2FudGVyYXMgZW4gYXVzdHJhbGVzIGEgcHJlY2lvcyBkZSAxOTcwLiAxOTgwLTE5OTBdKGh0dHBzOi8vZGF0b3MuZ29iLmFyL2RhdGFzZXQvc3NwbS1wcm9kdWN0by1pbnRlcm5vLWJydXRvLXNlY3RvcmlhbC0xOTgwLTE5OTApIA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI01JUCA5Nw0KIyBjb2VmaWNpZW50ZXMgZGUgcmVxdWVyaW1pZW50b3MgZGlyZWN0b3MNCg0KbWlwXzk3IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL01JUC9taXBfbWF0cml6MTIueGxzIiwgDQogICAgc2tpcCA9IDcpICU+JSANCiAgc2VsZWN0KC0iLi4uMSIpICU+JSANCiAgcmVuYW1lKGFjdGl2aWRhZCA9ICIuLi4yIikNCiAgIyBmaWx0ZXIoIi4uLjIiICVpbiUgYyggIlVzb3MgZGUgbGEgcHJvZHVjY2nDs24gbmFjaW9uYWwgYSBwcmVjaW9zIGLDoXNpY29zIiwgICJWYWxvciBicnV0byBkZSBsYSBwcm9kdWNjacOzbiBhIHByZWNpb3MgYsOhc2ljb3MiICkpDQoNCmNpX2V4dHJhY2Npb24gPC0gbWlwXzk3W2MoMTI2LDE0OSksIGMoImFjdGl2aWRhZCIgLCAiRXh0cmFjY2nDs24gZGUgcGV0csOzbGVvLCBnYXMsIGNhcmLDs24geSB1cmFuaW8iKV0NCg0KY29lZl90ZWNuaWNvXzk3IDwtIGNpX2V4dHJhY2Npb25bMSwyXS9jaV9leHRyYWNjaW9uWzIsMl0NCg0KeCA8LSBtaXBfOTdbYygxNDAsIDE0OSksXSAjJT4lIA0KICAgIyBnYXRoZXIoa2V5ID0gc2VjdG9yLCB2YWx1ZSA9IHZhbG9yLCAyOm5jb2woLikpICU+JSANCg0KaW1wX3Byb21fOTcgPC0gYXBwbHkoWCA9IHhbMSwyOm5jb2woeCldL3hbMiwyOm5jb2woeCldICwgTUFSR0lOID0gMSAsIEZVTiA9IGZ1bmN0aW9uKHgpIG1lYW4oeCwgbmEucm09VCkgICkNCiAgICANCg0KIyBjb2VmIENVTyAyMDA0IGEgcGFydGlyIGRlIENJL1ZCUA0KIyBjb2VmX3RlY25pY28gPC0gIDAuMzY5MTA0MzAyDQoNCg0KI1Blc28gZGUgbG9zIHNlcnZpY2lvcw0KI0NVTyANCiNsYSBzdW1hIGRlIGxhcyBjb2x1bW5hcyBub3MgZGEgZWwgVkJQDQpDT1UgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvTUlQL3NoX2NvdV8wNl8xNi54bHMiLCANCiAgICBza2lwID0gMikgJT4lDQogIHJlbmFtZShwcm9kdWN0byA9ICIuLi4xIiwNCiAgICAgICAgIGNwYyA9ICIuLi4yIikgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChwcm9kdWN0bywgIlxcZCIpICYgIShzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiXk4iKSkpICU+JQ0KICBncm91cF9ieShwcm9kdWN0bykgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0Kc2VydmljaW9fc19leHRyYWNjaW9uIDwtICBzdW0oQ09VWzEyXSkvc3VtKENPVVsxMV0pDQpucm93KENPVSkNCg0KDQojIERlcHJlY2lhY2nDs24gZGVsIHN0b2NrDQpjb25zdW1vX2tfZmlqb195cGYgPC0gKHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MvYmFsYW5jZXNfYXJnLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lDQogIGZpbHRlcihlbXByZXNhID09ICJZUEYiKSAlPiUgDQogIGdyb3VwX2J5KGVtcHJlc2EpICU+JSANCiAgbXV0YXRlKHRhc2FfZGVwcmVjaWFjaW9uID0gZGVwcmVjaWFjaW9uZXMvcHB5ZSkgJT4lIA0KICBzdW1tYXJpc2UodGFzYV9kZXByZWNpYWNpb24gPSBtZWFuKGRlcHJlY2lhY2lvbmVzL3BweWUpKSkkdGFzYV9kZXByZWNpYWNpb24NCg0KdmFyKChyZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL2JhbGFuY2VzX2FyZy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JQ0KICBmaWx0ZXIoZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICBncm91cF9ieShmZWNoYSkgJT4lDQogIHN1bW1hcmlzZSh0YXNhX2RlcHJlY2lhY2lvbiA9IG1lYW4oZGVwcmVjaWFjaW9uZXMvcHB5ZSkpKSR0YXNhX2RlcHJlY2lhY2lvbikNCg0KDQoNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojQ0NOTiAoZGF0b3Mgb2ZpY2lhbGVzKQ0KY2Nubl9vZmljaWFsIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVjb24vYmFzZS1taW5lcmlhLWUtaGlkcm9jYXJidXJvcyBjdWVudGFzIG5hY2lvbmFsZXMueGxzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gIkN1ZW50YXMgTmFjaW9uYWxlcyIsIHNraXAgPSA1KSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDsW8iLA0KICAgICAgICAgcGVyaW9kbyA9IlBlcsOtb2RvIiwNCiAgICAgICAgdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyA9ICAiLi4uNSIsDQogICAgICAgIHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyA9ICAiLi4uMTUiKSAlPiUgDQogIGZpbHRlcihpcy5uYShwZXJpb2RvKSwgIWlzLm5hKGFuaW8pICkgJT4lICAjZmlsdHJhbW9zIGxvcyBkYXRvcyBhbnVhbGVzDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsZXMgZGUgcGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICB2YnBfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zPSBhcy5kb3VibGUodmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyksDQogICAgICAgICB2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3M9IGFzLmRvdWJsZSh2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MpLA0KICAgICAgICAgdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyA9IHZicF9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgKiAoMSAtIHNlcnZpY2lvX3NfZXh0cmFjY2lvbiksDQogICAgICAgICB2YV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgPSB2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgKiAoMSAtIHNlcnZpY2lvX3NfZXh0cmFjY2lvbiksDQogICAgICAgICBjaV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3M9DQogICAgICAgICAgIHZicF9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MtdmFfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgY2lfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyAtIHZhX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcykgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLA0KICAgICAgICAgdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAsIA0KICAgICAgICAgdmFfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgY2lfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyAsIA0KICAgICAgICAgdmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgY2lfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3gvMTBeM30pICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiKSAlPiUgDQogIGxlZnRfam9pbihtYXNhX3NhbGFyaWFsX2hpZHJvY2FyYnVyb3MgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHVuaWRhZCwNCiAgICAgICAgICAgICAgICAgICAgIG1zX3RvdCA9IG1hc2Ffc2FsYXJpYWxfdG90YWxfb2VkZSwNCiAgICAgICAgICAgICAgICAgICAgIG1zX2V4dHIgPW1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbl9vZWRlICksIGJ5ID0gYygiYW5pbyIsICJ1bmlkYWQiKSkgJT4lIA0KICBtdXRhdGUoZWJlX3RvdCA9IHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAtIG1zX3RvdCwNCiAgICAgICAgIGViZV9leHRyID0gdmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zIC1tc19leHRyLA0KICAgICAgICAgZnVlbnRlID0gIkNDTk4gb2ZpY2lhbCIgKSAlPiUgDQogIHJlbmFtZSh2YnBfZXh0ciA9IHZicF9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjaV9leHRyID0gY2lfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgdmFfZXh0ciA9dmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgdmJwX3RvdD0gdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAsIA0KICAgICAgICAgdmFfdG90PSB2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjaV90b3QgPSBjaV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MpICU+JSANCiAgdW5ncm91cCgpDQpjY25uX29maWNpYWwNCg0KDQojY29uIGJhc2UgZGUgVkJQIGRlIGVsYWJvcmFjaW9uIHByb3BpYQ0KbWVhbl9jb2VmX21zIDwtICBjY25uX29maWNpYWwgJT4lIA0KICBzdW1tYXJpc2UoY29lZl9tc190b3QgPSBtZWFuKG1zX3RvdC92YnBfdG90LG5hLnJtPSBUKSwNCiAgICAgICAgICAgICAgY29lZl9tc19leHRyPSBtZWFuKG1zX2V4dHIvdmJwX2V4dHIgLG5hLnJtPSBUKSkNCg0KbWVkaWFuX2NvZWZfbXMgPC0gIGNjbm5fb2ZpY2lhbCAlPiUgDQogIHN1bW1hcmlzZShjb2VmX21zX3RvdCA9IG1lZGlhbihtc190b3QvdmJwX3RvdCxuYS5ybT0gVCksDQogICAgICAgICAgICAgIGNvZWZfbXNfZXh0cj0gbWVkaWFuKG1zX2V4dHIvdmJwX2V4dHIgLG5hLnJtPSBUKSkNCg0KIyAjIGVzdGltYWNpb24gcHJvcGlhIGNvZWYgdGVjbmljbw0KIyBjY25uX29maWNpYWwgJT4lIA0KIyAgIHN1bW1hcmlzZShjb2VmX3JlcV9leHRyX3lfc2VydiA9bWVhbihjaV9leHRyX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MvdmJwX2V4dHJfeV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcywgbmEucm09VCksDQojICAgICAgICAgIGNvZWZfcmVxX2V4dHIgPSBtZWFuKGNpX2V4dHJfaGlkcm9jYXJidXJvcy92YnBfZXh0cl9oaWRyb2NhcmJ1cm9zLCBuYS5ybT1UKSkNCg0KDQpgYGANCg0KIyMjIEVzdGltYWNpb25lcyBwcm9waWFzIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI3ZhcmlhYmxlcyBwYXJhIGxhIGVzdGltYWNpw7NuIA0KcHJlY2lvc195X2NhbnRpZGFkZXMgPC0gcHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudF9jcnVkbyA9IHVuaWRhZCwgcHJvZF9jcnVkbykgJT4lDQogIGxlZnRfam9pbihleHBvX3FfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRfY3J1ZG8gPXVuaWRhZCwgZXhwb19jcnVkbykpICU+JSANCiAgbGVmdF9qb2luKGV4aXN0ZW5jaWFzX3BldHJvbGVvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50X2NydWRvID0gdW5pZGFkLCBleGlzdGVuY2lhc19jcnVkbykpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGV4aXN0ZW5jaWFzX2NydWRvPTAgKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoZXhwb19jcnVkbz0wICkpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19taV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWRfcHJlY2lvX2NydWRvID0gdW5pZGFkLCBwcmVjaW9fY3J1ZG9fbWRvaW50KSwgYnkgPSAiYW5pbyIpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX3ByZWNpb19jcnVkbyA9IHVuaWRhZCwgcHJlY2lvX21lX2NydWRvKSwgYnkgPSBjKCJhbmlvIiwgInVuaWRhZF9wcmVjaW9fY3J1ZG8iKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9tZXJnZV9nYXNfTU1CVFUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRfZ2FzPSB1bmlkYWQscHJvZF9nYXMpLCBieSA9ICJhbmlvIikgJT4lDQogIGxlZnRfam9pbihleHBvX3FfZ2FzX01NQlRVICU+JSBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRfZ2FzPSB1bmlkYWQsIGV4cG9fZ2FzKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZF9wcmVjaW9fZ2FzID0gdW5pZGFkLCBwcmVjaW9fZXh0ZXJub19nYXMsIHByZWNpb19leHBvX2dhc19jb210cmFkZSksIGJ5ID0gImFuaW8iKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9faW50ZXJub19nYXNfbW1idHVfdXNkICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBwcmVjaW9fZ2FzX21kb2ludCkpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHRjcCwgdGNjKSwgYnkgPSAiYW5pbyIpDQoNCiMjIENyaXRlcmlvIENDTk4gDQpjcml0ZXJpb19jY25uIDwtIHByZWNpb3NfeV9jYW50aWRhZGVzICU+JSANCiAgbXV0YXRlKGNydWRvX21kb19pbnRlcm5vID0gcHJvZF9jcnVkbyAtIGV4cG9fY3J1ZG8sDQogICAgICAgICBleHBvX2dhcyA9IHJlcGxhY2VfbmEoZXhwb19nYXMsIDAgKSwNCiAgICAgICAgIGdhc19tZG9faW50ZXJubyA9IHByb2RfZ2FzIC0gZXhwb19nYXMsDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICANCiAgICAgICAgIyBjcml0ZXJpbyBDQ05ODQogICAgICAgICB2YnBfdG90ID0gKChjcnVkb19tZG9faW50ZXJubypwcmVjaW9fY3J1ZG9fbWRvaW50Kw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb19jcnVkbypwcmVjaW9fbWVfY3J1ZG8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdhc19tZG9faW50ZXJubyAqIHByZWNpb19nYXNfbWRvaW50IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtleHBvX2dhcypwcmVjaW9fZXhwb19nYXNfY29tdHJhZGUgKSp0Y2MpLzEwXjYsDQogICAgICAgICB2YnBfZXh0ciA9dmJwX3RvdCooMS1zZXJ2aWNpb19zX2V4dHJhY2Npb24pLA0KICAgICAgICAgY2lfdG90ID0gdmJwX3RvdCAqY29lZl90ZWNuaWNvXzk3JGBFeHRyYWNjacOzbiBkZSBwZXRyw7NsZW8sIGdhcywgY2FyYsOzbiB5IHVyYW5pb2AgLA0KICAgICAgICAgY2lfZXh0ciA9IHZicF9leHRyICogY29lZl90ZWNuaWNvXzk3JGBFeHRyYWNjacOzbiBkZSBwZXRyw7NsZW8sIGdhcywgY2FyYsOzbiB5IHVyYW5pb2AsDQogICAgICAgIHZhX3RvdD0gICB2YnBfdG90IC0gY2lfdG90LA0KICAgICAgICB2YV9leHRyPSAgIHZicF9leHRyIC0gY2lfZXh0ciwNCiAgICAgICAgbXNfZXh0ciA9IHZicF9leHRyICptZWFuX2NvZWZfbXMkY29lZl9tc19leHRyLA0KICAgICAgICAgbXNfdG90ID0gdmJwX3RvdCAqbWVhbl9jb2VmX21zJGNvZWZfbXNfdG90LA0KICAgICAgICAgZWJlX3RvdCA9IHZhX3RvdCAtIG1zX3RvdCwNCiAgICAgICAgIGViZV9leHRyPXZhX2V4dHIgLSBtc190b3QgICAgICwNCiAgICAgICAgZnVlbnRlID0gIkNyaXRlcmlvIENDTk4iKQ0KY3JpdGVyaW9fY2Nubg0KDQoNCiMgRW1wYWxtZSBDQ05ODQppbmRpY2VfdmJwX2NyaXRlcmlvX2Njbm4gPC0gY3JpdGVyaW9fY2NubiAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh2YnBfY3JpdGVyaW9fY2Nubl8wNCA9IGdlbmVyYXJfaW5kaWNlKHZicF90b3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhID0gYW5pbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDIwMDQpLA0KICAgICAgICAgdmJwX2NyaXRlcmlvX2Njbm5fMTIgPSBnZW5lcmFyX2luZGljZSh2YnBfdG90LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYSA9IGFuaW8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDEyKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdmJwX2NyaXRlcmlvX2Njbm5fMDQsdmJwX2NyaXRlcmlvX2Njbm5fMTIpDQoNCg0KZW1wYWxtZV9jY25uIDwtIGNjbm5fb2ZpY2lhbCAlPiUgDQogIGZ1bGxfam9pbihpbmRpY2VfdmJwX2NyaXRlcmlvX2Njbm4sIGJ5ID0gImFuaW8iKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBtdXRhdGUodmJwX2V4dHIgPSBjYXNlX3doZW4oYW5pbyA8IDIwMDQgfiBjY25uX29maWNpYWwkdmJwX2V4dHJbY2Nubl9vZmljaWFsJGFuaW8gPT0gMjAwNF0gKiB2YnBfY3JpdGVyaW9fY2Nubl8wNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAyMDEyIH4gY2Nubl9vZmljaWFsJHZicF9leHRyW2Njbm5fb2ZpY2lhbCRhbmlvID09IDIwMTJdICAqIHZicF9jcml0ZXJpb19jY25uXzEyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHZicF9leHRyKSAsDQogICAgdmJwX3RvdCA9IGNhc2Vfd2hlbiggYW5pbyA8IDIwMDQgfiBjY25uX29maWNpYWwkdmJwX3RvdFtjY25uX29maWNpYWwkYW5pbyA9PSAyMDA0XSAqIHZicF9jcml0ZXJpb19jY25uXzA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDIwMTIgfiBjY25uX29maWNpYWwkdmJwX3RvdFtjY25uX29maWNpYWwkYW5pbyA9PSAyMDEyXSAgKiB2YnBfY3JpdGVyaW9fY2Nubl8xMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YnBfdG90KSwNCiAgICBjaV9leHRyID0gY2FzZV93aGVuKCAoYW5pbyA8IDIwMDQpIHwgKGFuaW8gPiAyMDEyKSAgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZicF9leHRyICpjb2VmX3RlY25pY29fOTckYEV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbywgZ2FzLCBjYXJiw7NuIHkgdXJhbmlvYCAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBjaV9leHRyKSwNCiAgICBjaV90b3QgPSBjYXNlX3doZW4oIChhbmlvIDwgMjAwNCkgfCAoYW5pbyA+IDIwMTIpICB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmJwX3RvdCAqY29lZl90ZWNuaWNvXzk3JGBFeHRyYWNjacOzbiBkZSBwZXRyw7NsZW8sIGdhcywgY2FyYsOzbiB5IHVyYW5pb2AgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gY2lfdG90KSAsDQogICAgdmFfdG90ID0gY2FzZV93aGVuKGlzLm5hKHZhX3RvdCkgfiB2YnBfdG90IC0gY2lfdG90ICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHZhX3RvdCksDQogICAgdmFfZXh0ciA9IGNhc2Vfd2hlbihpcy5uYSh2YV9leHRyKSB+IHZicF9leHRyIC0gY2lfZXh0ciAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YV9leHRyKSwNCiAgICBtc190b3QgPSBjYXNlX3doZW4oaXMubmEobXNfdG90KSB+IHZicF90b3QqbWVhbl9jb2VmX21zJGNvZWZfbXNfdG90LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gbXNfdG90KSAsDQogICAgbXNfZXh0ciA9IGNhc2Vfd2hlbihpcy5uYShtc19leHRyKSB+IHZicF90b3QqbWVhbl9jb2VmX21zJGNvZWZfbXNfZXh0ciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IG1zX2V4dHIpLCANCiAgICBlYmVfdG90ID0gY2FzZV93aGVuKGlzLm5hKGViZV90b3QpIH4gdmFfdG90IC1tc190b3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBlYmVfdG90KSwNCiAgICBlYmVfZXh0ciA9IGNhc2Vfd2hlbihpcy5uYShlYmVfZXh0cikgfiB2YV90b3QgLW1zX3RvdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGViZV9leHRyKSwNCiAgICBmdWVudGUgPSAiRW1wYWxtZSBDQ05OIikNCg0KIyMgQ3JpdGVyaW8gcHJvcGlvIA0KY3JpdGVyaW9fcHJvcGlvIDwtIHByZWNpb3NfeV9jYW50aWRhZGVzICU+JQ0KICBsZWZ0X2pvaW4oZW1wYWxtZV9jY25uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sdW5pZGFkLCBjaV90b3QsIGNpX2V4dHIsIG1zX3RvdCwgbXNfZXh0ciApICkgJT4lIA0KICBsZWZ0X2pvaW4oc3RvY2tfZXN0aW1hZG8gJT4lDQogICAgICAgICAgICAgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lDQogICAgICAgICAgICAgICMgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllX2VzdGltYWRvX2JvbHNhciIpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGNvbnN1bW9fa19maWpvID0gdmFsb3IgKiBpcGNfMTggKiBjb25zdW1vX2tfZmlqb195cGYpICU+JSANCiAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBjb25zdW1vX2tfZmlqbykpICU+JSANCiAgbXV0YXRlKA0KICAgICAgICAjIGNyaXRlcmlvIHByb3Bpbw0KICAgICAgICAgdmJwX3RvdCA9KCAocHJvZF9jcnVkbypwcmVjaW9fbWVfY3J1ZG8gICsgcHJvZF9nYXMgKiBwcmVjaW9fZXh0ZXJub19nYXMpICogdGNwKS8xMF42LA0KICAgICAgICAgdmFfdG90ID0gdmJwX3RvdCAtIGNpX2V4dHIsDQogICAgICAgICBlYmVfdG90ID0gdmFfdG90IC0gbXNfZXh0ciAsDQogICAgICAgICBwdiA9IGViZV90b3QgLSBjb25zdW1vX2tfZmlqbyAtICh2YnBfdG90ICogaW1wX3Byb21fOTcpLCANCiAgICAgICAgIHZicF9leHRyID0gIE5BICwNCiAgICAgICAgIGViZV9leHRyID1OQSwNCiAgICAgICAgIHZhX2V4dHI9TkEsIA0KICAgICAgICAgZnVlbnRlID0gIkNyaXRlcmlvIHByb3BpbyIpDQoNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmZpbHRybyA8LSBjKCJhbmlvIiwgInVuaWRhZCIsICJmdWVudGUiLCAidmJwX3RvdCIsICJ2YnBfZXh0ciIsDQogICAgICAgICAgICAiY2lfdG90IiwgImNpX2V4dHIiLCAgIm1zX3RvdCIsICJtc19leHRyIiwNCiAgICAgICAgICAgICJ2YV90b3QiLCAgInZhX2V4dHIiICwgImViZV90b3QiLCAiZWJlX2V4dHIiICApDQoNCnZhbG9yX3RvdGFsX3Byb2R1Y2Npb24gPC0gY2Nubl9vZmljaWFsICU+JSANCiAgcmJpbmQoY3JpdGVyaW9fY2NubiAlPiVzZWxlY3QoZmlsdHJvKSkgJT4lIA0KICByYmluZChlbXBhbG1lX2Njbm4gJT4lIHNlbGVjdChmaWx0cm8pKSAlPiUgDQogIHJiaW5kKGNyaXRlcmlvX3Byb3BpbyAlPiUgc2VsZWN0KGZpbHRybykpICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLCB2YWx1ZT12YWxvciwgMzoxMikgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yIC9pcGNfMTgsDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpDQoNCg0KICANCg0KZ3JhZl92YWxvcl9wcm9kdWNjaW9uIDwtIHZhbG9yX3RvdGFsX3Byb2R1Y2Npb24gJT4lIA0KICBmaWx0ZXIoYW5pbyA+IDE5NjApICU+JSANCiAgZ2dwbG90KCBhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZnVlbnRlKSkrDQogIGdlb21fbGluZShhbHBoYSA9IDAuNykrDQogIGdlb21fcG9pbnQoc2l6ZSA9IDAuNDM1LCBhbHBoYSA9IDAuMikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlZhbG9yIGRlIGxhIFByb2R1Y2Npw7NuIGhpZHJvY2FyYnVyw61mZXJhIiwgDQogICAgICAgc3VidGl0bGUgPSAiVmFsb3IgdG90YWwgeSBjb21wb25lbnRlcyIsDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlKQ0KZ3AgPC0gZ2dwbG90bHkoZ3JhZl92YWxvcl9wcm9kdWNjaW9uLCB3aWR0aCA9IDc1MCwgaGVpZ2h0ID0gODAwKSAgDQpncFtbJ3gnXV1bWydsYXlvdXQnXV1bWydhbm5vdGF0aW9ucyddXVtbMl1dW1sneCddXSA8LSAtMC4xMQ0KZ3AgJT4lIGxheW91dChtYXJnaW4gPSBsaXN0KGwgPSA3NSkpDQoNCg0KYGBgDQoNCg0KDQoNCiMgVGFzYSBkZSBHYW5hbmNpYQ0KDQoNCiQkVEdfe2hpZHJvY2FyYnVyb3N9ID0gXGZyYWN7UFZfe2hpZHJvY2FyYnVyw61mZXJhfX17S1RBX3toaWRyb2NhcmJ1csOtZmVyb319JCQNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI2xldmFudG8gZGF0YSBzZXRzIGRlIG90cm8gUiBtYXJrZG93bg0KYmFsYW5jZXNfYXJnIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MvYmFsYW5jZXNfYXJnLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoZmVjaGEgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJVktJW0tJWQiKSwgWDEgPSBjb2xfc2tpcCgpKSkNCg0KcGV0cm9icmFzX2FyZ19zZWdtZW50b3MgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcmVzdWx0YWRvcy9wZXRyb2JyYXNfYXJnX3NlZ21lbnRvcy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpDQoNCnlwZl9zZWdtZW50b3MgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcmVzdWx0YWRvcy95cGZfc2VnbWVudG9zLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkNCg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfdGdfZW1wIDwtIGJhbGFuY2VzX2FyZyAlPiUNCiAgZmlsdGVyKHRnX2FudCAhPSBJbmYpICU+JSANCiAgZ2dwbG90KGFlcyhmZWNoYSwgdGdfYW50LCBjb2xvciA9IGVtcHJlc2EpKSsgDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICBsYWJzKHRpdGxlID0gIlRhc2EgZGUgZ2FuYW5jaWEgZW1wcmVzYXMgaGlkcm9jYXJidXJvcyIsDQogICAgICAgc3VidGl0bGUgPSAgIkFudGVzIGRlIGltcHVlc3RvcyIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkrDQogIGZhY2V0X3dyYXAofnNlY3RvcikNCg0KZ2dwbG90bHkoZ3JhZl90Z19lbXAsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfdGdfeXBmIDwtIHlwZl9zZWcgJT4lIA0KICAjIGZpbHRlcihzZWN0b3IgJWluJSBjKCJxdWltaWNhIiwgImRvd25zdHJlYW0iLCAidXBzdHJlYW0iKSkgJT4lDQogIGZpbHRlcihzZWN0b3IgIT0gImFkbV9jZW50cmFsIikgJT4lDQogIGdncGxvdChhZXMoZmVjaGEsIHRnX2FjdGl2bywgY29sb3IgPSBzZWN0b3IpKSsgDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogICMgZmFjZXRfd3JhcCh+c2VjdG9yKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSsNCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGdhbmFuY2lhIGRlIHNlZ21lbnRvcyBZUEYiKQ0KZ3JhZl90Z195cGYNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpncmFmX3RnX3BldHJvYnJhcyA8LSBwZXRyb2JyYXNfYXJfc2VnICU+JSANCiAgZmlsdGVyKHNlY3RvciAlaW4lIGMoInBldHJvcXVpbWljYSIsICJkb3duc3RyZWFtIiwgInVwc3RyZWFtIiwgImdhc195X2VuZXJnaWEiKSkgJT4lDQogICMgZmlsdGVyKHNlY3RvciAhPSAiYWRtX2NlbnRyYWwiKSAlPiUNCiAgZ2dwbG90KGFlcyhmZWNoYSwgdGcsIGNvbG9yID0gc2VjdG9yKSkrDQogIGdlb21fbGluZSgpKw0KICAjIGZhY2V0X3dyYXAofnNlY3RvcikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkrDQogIGxhYnModGl0bGUgPSAiVGFzYSBkZSBnYW5hbmNpYSBkZSBzZWdtZW50b3MgUGV0cm9icmFzIEFyZ2VudGluYSIpDQpncmFmX3RnX3BldHJvYnJhcw0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAgICxmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NX0NCiNFc3RpbWFjacOzbiBkZSB0YXNhIGRlIGdhbmFuY2lhIHRvdGFsIHJhbWENCg0KdGFzYV9nYW5hbmNpYV9yYW1hX2ZsdWpvIDwtIGNyaXRlcmlvX3Byb3BpbyAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHYpICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAsIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZShwdiA9IHB2IC9pcGNfMTgsDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpICU+JSANCiAgbGVmdF9qb2luKHN0b2NrX3lfcG96b3MgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHBweWUgPSBwcHllX2VzdGltYWRvLCBzdG9ja19zZWxlY2Npb25hZG8gPSBmdWVudGVfcHB5ZSwgZnVlbnRlX3Bvem8pLA0KICAgICAgICAgICAgYnkgPSBjKCJhbmlvIikpICU+JSANCiAgbXV0YXRlKHRhc2FfZ2FuYW5jaWEgPSBwdi9wcHllKQ0KDQpncmFmX3RnX3JhbWFfMSA8LSB0YXNhX2dhbmFuY2lhX3JhbWFfZmx1am8gJT4lIA0KICBmaWx0ZXIoYW5pbyA+MTk2MCkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHRhc2FfZ2FuYW5jaWEsIGNvbG9yID1mdWVudGVfcG96byApKSsNCiAgZ2VvbV9saW5lKGFscGhhID0gMC41KSsNCiAgZ2VvbV9wb2ludCgpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGdhbmFuY2lhIGhpZHJvY2FyYnVyw61mZXJhIGNvbiBQUHlFIGEgcGFydGlyIGRlIGZsdWpvIGRlIHBvem9zKDE5NjAgLSAyMDE4KSIpKw0KICBmYWNldF93cmFwKH5zdG9ja19zZWxlY2Npb25hZG8pDQojIGdncGxvdGx5KGdyYWZfdGdfcmFtYV8xLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KZ3JhZl90Z19yYW1hXzENCg0KIyMjIyMjIyMjIyMjDQoNCiMgI2VsIERGIHRhc2FfZ2FuYW5jaWFfcmFtYV9zdG9jayBjb250aWVuZSBsYXMgZXN0aW1hY2lvbmVzIGRpc3RpbnRhcyBlc3RpbWFjaW9uZXMgZGUgS1RBIGNvbiBzdG9jayBkZSBwb3pvcyANCiMgdGFzYV9nYW5hbmNpYV9yYW1hX3N0b2NrIDwtIHZhbG9yX3RvdGFsX3Byb2R1Y2Npb24gJT4lDQojICAgZmlsdGVyKHZhcmlhYmxlID09ICJleGNlZGVudGVfYnJ1dG9fZXhwbG90YWNpb24iICYgZnVlbnRlID09ICJDcml0ZXJpbyBwcm9waW8gY29uIFZCUCBDQ05OIiApICU+JSANCiMgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBleGNlZGVudGVfYnJ1dG9fZXhwbG90YWNpb24gPSB2YWxvcikgJT4lIA0KIyAgIGxlZnRfam9pbihzdG9ja19lc3RpbWFkbyAlPiUgDQojICAgICAgICAgICAgICAgIyBmaWx0ZXIodmFyaWFibGUgJWluJSBjKCJwcHllX2VzdGltYWRvX2FmaXAiLCAicHB5ZV9lc3RpbWFkb19ib2xzYXIiLA0KIyAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAicHB5ZV9lc3RpbWFkb190b3RhbCIpKSAlPiUNCiMgICAgICAgICAgICAgICAjIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZV9lc3RpbWFkb19ib2xzYXIiKSAlPiUNCiMgICAgICAgICAgICAgICAjIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZV9lc3RpbWFkb190b3RhbCIpICU+JQ0KIyAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsICBwcHllID0gdmFsb3IsIHN0b2NrX3NlbGVjY2lvbmFkbyA9IGZ1ZW50ZV9wcHllKSAlPiUgDQojICAgICAgICAgICAgICAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikpICU+JSANCiMgICBtdXRhdGUodGFzYV9nYW5hbmNpYSA9IGV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbi9wcHllKQ0KIyANCiMgZ3JhZl90Z19yYW1hXzIgPC0gdGFzYV9nYW5hbmNpYV9yYW1hX3N0b2NrICU+JSANCiMgICBmaWx0ZXIoYW5pbyA+MTk2MCkgJT4lIA0KIyAgIGdncGxvdChhZXMoYW5pbywgdGFzYV9nYW5hbmNpYSwgY29sb3IgPSBzdG9ja19zZWxlY2Npb25hZG8pKSsNCiMgICBnZW9tX2xpbmUoYWxwaGEgPSAwLjUpKw0KIyAgIGdlb21fcG9pbnQoKSsNCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiMgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwNCiMgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQojICAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIGdhbmFuY2lhIGhpZHJvY2FyYnVyw61mZXJhIGNvbiBQUHlFIGEgcGFydGlyIGRlIHN0b2NrIGRlIHBvem9zICgxOTYwIC0gMjAxOCkiKQ0KIyAjIGdncGxvdGx5KGdyYWZfdGdfcmFtYV8yLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KIyBncmFmX3RnX3JhbWFfMg0KDQpgYGANCg0KIyMgUmVudGEgYXByb3BpYWRhIHBvciBsYXMgZW1wcmVzYXMgZGUgbGEgcmFtYQ0KDQpMYSByZW50YSBhcHJvcGlhZGEgcG9yIGxhcyBlbXByZXNhcyBkZSBsYSByYW1hIHNlIGNhbGN1bGEgcG9yIG1lZGlvIGRlbCBkaWZlcmVuY2lhbCBkZSB0YXNhcyBkZSBnYW5hbmNpYSBlbnRyZSBlbCBzZWN0b3IgaGlkcm9jYXJidXLDrWZlcm8gcXVlIHN1cmdlIGEgcGFydGlyIGRlIGxvcyBiYWxhbmNlcyB5IGxhIHJlbnRhYmlsaWRhZCBub3JtYWwgZGUgbGEgZWNvbm9tw61hLg0KDQokJFJlbnRhXF9lbXByZXNhcyA9IEtUQV97aGlkcm9jYXJidXLDrWZlcm99ICogKFRHX3toaWRyb2NhcmJ1csOtZmVyYX0gLSBUR197cmVmZXJlbmNpYX0pJCQNCiQkVEdfe2hpZHJvY2FyYnVyw61mZXJhfSA9IFxmcmFje0djaWFfe2hpZHJvY2FyYnVyb3N9fXtLVEFfe2hpZHJvY2FyYnVyw61mZXJvfX0kJCANClBvciBsbyBjdWFsLCBsYSByZW50YSBhcHJvcGlhZGEgcG9yIGxhcyBlbXByZXNhcyBkZSBsYSByYW1hIHNlcsOtYSBlcXVpdmFsZW50ZSBhOg0KDQokJFJlbnRhXF9lbXByZXNhcyA9IEdjaWFfe2hpZHJvY2FyYnVyb3N9IC0gS1RBX3toaWRyb2NhcmJ1csOtZmVyb30gKiAgVEdfe3JlZmVyZW5jaWF9JCQNCg0KRG9uZGU6DQoNCiogJEtUQV97aGlkcm9jYXJidXLDrWZlcm99JCA9IFN0b2NrIGRlIGNhcGl0YWwgYWRlbGFudGFkbyBkZSBlbXByZXNhcyBoaWRyb2NhcmJ1csOtZmVyYXMNCiogJFRHX3toaWRyb2NhcmJ1csOtZmVyYX0kID0gVGFzYSBkZSBnYW5hbmNpYSBkZSBlbXByZXNhcyBoaWRyb2NhcmJ1csOtZmVyYXMNCiogJFRHX3tyZWZlcmVuY2lhfSQgPSBUYXNhIGRlIGdhbmFuY2lhIGRlIHJlZmVyZW5jaWENCiogJEdjaWFfe2hpZHJvY2FyYnVyb3N9JCA9IEdhbmFuY2lhIGRlIGVtcHJlc2FzIGhpZHJvY2FyYnVyw61mZXJhcw0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQogIA0KdGdfaW5kdXN0cmlhbCA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1RHL3RnX2luZHVzdHJpYWwuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUgDQogIG11dGF0ZShhbmlvID0gYXMuZG91YmxlKGFuaW8pKQ0KDQpyZW50YV90ZyA8LSAgdGFzYV9nYW5hbmNpYV9yYW1hX2ZsdWpvICU+JQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBzdG9ja19zZWxlY2Npb25hZG8sIGZ1ZW50ZV9wb3pvLCBwcHllICwgdGFzYV9nYW5hbmNpYSkgJT4lIA0KICBmaWx0ZXIoc3RvY2tfc2VsZWNjaW9uYWRvID09ICJwcHllX2JvbHNhciIsZnVlbnRlX3Bvem8gPT0gInBvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhIiApICU+JSANCiAgbGVmdF9qb2luKHRnX2luZHVzdHJpYWwsIGJ5ID0gImFuaW8iKSAlPiUgDQogIHJlbmFtZSh0Z19oaWRyb2NhcmJ1cm9zID0gdGFzYV9nYW5hbmNpYSkgJT4lIA0KICBtdXRhdGUocmVudGFfY29uX3RnX2ppYyA9IHBweWUgKih0Z19oaWRyb2NhcmJ1cm9zIC0gdGdfaW5kdV9qaWMpLA0KICAgICAgICAgcmVudGFfY29uX3RnX2VtID0gcHB5ZSAqKHRnX2hpZHJvY2FyYnVyb3MgLSB0Z19pbmR1X2VtKSwNCiAgICAgICAgIHVuaW9uX3RnID0gY2FzZV93aGVuKGFuaW8gPCAxOTkzIH4gdGdfaW5kdV9qaWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID49IDE5OTMgfiB0Z19pbmR1X2VtKSkgJT4lIA0KICBkaXN0aW5jdCgpDQoNCmdyYWZfdGdfcmFtYSA8LSByZW50YV90ZyAlPiUNCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHJlbnRhLA0KICAgICAgICAgOToxMCkgJT4lIA0KICBmaWx0ZXIoYW5pbyA+MTk2MCkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHJlbnRhLCBmaWxsID0gdGlwb19yZW50YSkpKyANCiAgZ2VvbV9jb2wocG9zaXRpb24gPSJkb2RnZSIpKw0KICAjIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSBwb3IgZGlmZXJlbmNpYWwgZGUgdGFzYXMgZGUgZ2FuYW5jaWEiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkNCmdncGxvdGx5KGdyYWZfdGdfcmFtYSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnJlbnRhX2VtcHJlc2FzX2JhbGFuY2VzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MvcmVudGFfZW1wcmVzYS5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpIA0KDQpyZW50YV9wcm9kdWNjaW9uX2JhbGFuY2VzIDwtICByZW50YV9lbXByZXNhc19iYWxhbmNlcyAlPiUgDQogIGZpbHRlcighKGVtcHJlc2EgJWluJSBjKCJjaGV2cm9uX2dsb2JhbCIsICJwZXRyb2JyYXNfZ2xvYmFsIiApKSwNCiAgICAgICAgIHNlY3RvciAlaW4lIGMoICJpbnRlZ3JhZGEiLCAicHJvZHVjY2lvbiIpDQogICAgICAgICApICU+JSANCiAgZ3JvdXBfYnkoZmVjaGEsIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UoS1RBID0gc3VtKEtUQSwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIGdhbmFuY2lhX2VtcHJlc2FzX2FudGVzX2ltcHVlc3RvcyA9IHN1bShnY2lhX2FudCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIGdhbmFuY2lhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zID0gc3VtKGdjaWFfZGVzcCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIHJlbnRhX2VtcHJlc2FzX2FudGVzX2ltcHVlc3RvcyA9IHN1bShyZW50YV9hbnRfY29yciwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zID0gc3VtKHJlbnRhX2Rlc3BfY29yciwgbmEucm0gPSBUKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoIGFuaW8gPSBsdWJyaWRhdGU6OnllYXIoZmVjaGEpKSAlPiUgDQogIHNlbGVjdChhbmlvLCBldmVyeXRoaW5nKC4pLCAtZmVjaGEpDQoNCmdyYWZfcmVudGFfZW1wIDwtIHJlbnRhX2VtcHJlc2FzX2JhbGFuY2VzICU+JQ0KICBmaWx0ZXIoc2VjdG9yICE9ICJkaXN0cmlidWNpb24iKSAlPiUgDQogIGZpbHRlcighaXMubmEocmVudGFfZGVzcF9wMTgpLA0KICAgICAgICAgIShlbXByZXNhICVpbiUgYygiY2hldnJvbl9nbG9iYWwiLCAicGV0cm9icmFzX2dsb2JhbCIgKSkpICU+JSANCiAgZ2dwbG90KGFlcyhmZWNoYSwgcmVudGFfZGVzcF9wMTgsIGZpbGwgPSBlbXByZXNhKSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAic3RhY2siKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSBwb3IgZW1wcmVzYSIsDQogICAgICAgc3VidGl0bGUgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIpKw0KICBmYWNldF93cmFwKH5zZWN0b3IpDQoNCmdncGxvdGx5KGdyYWZfcmVudGFfZW1wLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KDQpgYGANCg0KDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCmVqZXJjaWNpbyA8LSB2YWxvcl90b3RhbF9wcm9kdWNjaW9uICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJ2YV90b3QiKSAlPiUgDQogICMgZnVsbF9qb2luKHN0b2NrX3JhbWEgJT4lDQogICMgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHJhbWEgPSBzZWN0b3IsIGFjdGl2b3MgPSB2YXJpYWJsZSwgdmFsb3JfYWN0aXZvcyA9IHZhbG9yLCANCiAgIyAgICAgICAgICAgICAgICAgICAgZnVlbnRlX2FjdGl2b3MgPSBmdWVudGUpICU+JSANCiAgIyAgICAgICAgICAgICAjIGZpbHRlcihmdWVudGVfYWN0aXZvcyA9PSAiQUZJUCIpKSU+JQ0KICAjICAgICAgICAgICAgIGZpbHRlcihmdWVudGVfYWN0aXZvcyA9PSAiQm9sc2FyIikpJT4lDQogIGZ1bGxfam9pbihzdG9ja19iYWxhbmNlc19lbXByZXNhcyAlPiUNCiAgICAgICAgICAgICAgdW5ncm91cCgpICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGVtcHJlc2EgPT0gIllQRiIpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHJhbWEgPSBzZWN0b3IsIGFjdGl2b3MgPSB2YXJpYWJsZSwgdmFsb3JfYWN0aXZvcyA9IHZhbG9yKSkgJT4lIA0KICAgICAgICAgICAgICAjIGZpbHRlcihmdWVudGVfYWN0aXZvcyA9PSAiQm9sc2FyIikpJT4lDQogIG11dGF0ZShyZWxhY2lvbiA9IHZhbG9yX2FjdGl2b3MvdmFsb3IpICU+JSANCiAgZmlsdGVyKGFuaW8gPiAxOTkwLCAhKGlzLm5hKGFjdGl2b3MpKSkNCmVqZXJjaWNpbyAgICAgICAgICAgIA0KICANCmdyYWZfcmVsYWNpb24gPC0gZWplcmNpY2lvICU+JSANCiAgIyBnZ3Bsb3QoIGFlcyhhbmlvLCByZWxhY2lvbiwgY29sb3IgPSByYW1hKSkrDQogIGdncGxvdCggYWVzKGFuaW8sIHJlbGFjaW9uLCBjb2xvciA9IGZ1ZW50ZSkpKw0KICAjIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIkFjdGl2byBzb2JyZSB2YWxvciBhZ3JlZ2FkbyIpKw0KICBmYWNldF93cmFwKH5hY3Rpdm9zKSANCg0KICBnZ3Bsb3RseShncmFmX3JlbGFjaW9uLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KDQoNCmBgYA0KDQoNCg0KIyBSZW50YSBwb3IgZWwgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBlbnRyZSBlbCBtZXJjYWRvIGludGVybm8geSBsYXMgcmVmZXJlbmNpYXMgaW50ZXJuYWNpb25hbGVzIA0KDQpSZW50YSBhcHJvcGlhZGEgbWVkaWFudGUgZWwgYWJhcmF0YW1pZW50byBlbiBlbCBjb25zdW1vIGludGVybm8gcG9yIGVmZWN0byBkZWwgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vL2V4dGVybm8sIHNvYnJldmFsdWFjacOzbiBkZSBsYSBtb25lZGEgeSByZXRlbmNpb25lcyBhIGxhIGV4cG9ydGFjacOzbg0KDQoNCiMjIyBDcml0ZXJpbyBkZSBjw7NtcHV0byBkZSBKSyAodmFyaWFibGUgJ3JlbnRhX2RpZl9wcmVjaW9zJykNCg0KJCRSRFA9IFByb2RJbnQgKiBQZXh0ICogVENQIC0gUHJvZEludCAqIFBNSSAqIFRDQyQkDQoNCkRvbmRlOg0KDQoqICRSRFAkID0gUmVudGEgYXByb3BpYWRhIHBvciBlZmVjdG8gZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vL2V4dGVybm8geSBzb2JyZXZhbHVhY2nDs24NCiogJE1kb0ludCQgPSBQcm9kdWNjacOzbiBkZXN0aW5hZGEgYWwgTWVyY2FkbyBJbnRlcm5vOiBQcm9kdWNjacOzbiAtIEV4cG9ydGFjaW9uZXMgLSBFeGlzdGVuY2lhcyAoYmFycmlsZXMgZGUgcGV0csOzbGVvIMOzIE1NQlRVKQ0KKiAkUGV4dCQgPSBQcmVjaW8gZGUgcmVmZXJlbmNpYSBkZWwgbWVyY2FkbyBleHRlcm5vIChVU0QpDQoqICRQTUkkID0gUHJlY2lvIGRlIHZlbnRhIGRlbCBtZXJjYWRvIGludGVybm8gKFVTRCkNCiogJFRDUCQgPSBUaXBvIGRlIENhbWJpbyBkZSBQYXJpZGFkDQoqICRUQ0MkID0gVGlwbyBkZSBDYW1iaW8gQ29tZXJjaWFsDQoNCiMjIyBDcml0ZXJpbyBkZSBjw7NtcHV0byBkZSBKSUMgeSBjaWEgKHZhcmlhYmxlICdyZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uJykNCiQkUkRQID0gTWRvSW50ICogUE1JICogKFxmcmFje1RDUH17VENDfSAgLSAxKSQkICANCg0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gPC0gcHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogICMgZmlsdGVyKGFuaW8gPiAxOTkwKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByb2RfY3J1ZG8pICU+JSANCiAgbGVmdF9qb2luKGV4cG9fcV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4cG9fY3J1ZG8pKSAlPiUgI3VuaW9uIGNvbiBleHBvDQogIGxlZnRfam9pbihleGlzdGVuY2lhc19wZXRyb2xlbykgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoZXhpc3RlbmNpYXNfY3J1ZG89MCApKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChleHBvX2NydWRvPTAgKSkgJT4lIA0KICAjIG11dGF0ZShwcm9kX21kb19pbnRlcm5vID0gcHJvZF9jcnVkbyAtIGV4cG9fY3J1ZG8gLSBleGlzdGVuY2lhc19jcnVkbykgJT4lIA0KICBtdXRhdGUocHJvZF9tZG9faW50ZXJubyA9IHByb2RfY3J1ZG8gLSBleHBvX2NydWRvICkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19jcnVkb19tZG9pbnQpLA0KICAgICAgICAgICAgYnkgPSBjKCJhbmlvIikpICU+JSAgIyB1bm8gY29uIHByZWNpbyBpbnRlcm5vDQogIGxlZnRfam9pbihwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGJyZW50ID0gY2FzZV93aGVuKGFuaW8gPCAxOTg3IH4gYnJlbnRfaGlzdG9yaWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID49IDE5ODcgfiBicmVudF9pZWEgKSkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX21lX2NydWRvLCBicmVudCApLA0KICAgICAgICAgICAgYnkgPSBjKCJhbmlvIikpICU+JSAgICMgdW5vIGNvbiBwcmVjaW8gZXh0ZXJubyANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUocmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gPSBwcm9kX21kb19pbnRlcm5vKnByZWNpb19tZV9jcnVkbyp0Y3AgLSBwcm9kX21kb19pbnRlcm5vKnByZWNpb19jcnVkb19tZG9pbnQqdGNjLA0KICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQgPSBwcm9kX21kb19pbnRlcm5vKmJyZW50KnRjcCAtIHByb2RfbWRvX2ludGVybm8qcHJlY2lvX2NydWRvX21kb2ludCp0Y2MsDQogICAgICAgICAjIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24gPSBwcm9kX21kb19pbnRlcm5vICpwcmVjaW9fY3J1ZG9fbWRvaW50KHRjcC90Y2MtMSksDQogICAgICAgICB1bmlkYWRfcHJlY2lvID0gIlVTRCIsIHVuaWRhZF9yZW50YSA9ICJQZXNvcyBjb3JyaWVudGVzIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRpZGFkPSB1bmlkYWQgLCBwcm9kX2NydWRvLCBleHBvX2NydWRvLCBleGlzdGVuY2lhc19jcnVkbywgcHJvZF9tZG9faW50ZXJubywNCiAgICAgICAgIHVuaWRhZF9wcmVjaW8sIHByZWNpb19pbnRlcm5vX2NydWRvID0gcHJlY2lvX2NydWRvX21kb2ludCwgcHJlY2lvX2V4dGVybm9fY3J1ZG8gPSBwcmVjaW9fbWVfY3J1ZG8sDQogICAgICAgICAgdGNjLCB0Y3AsIHVuaWRhZF9yZW50YSwgDQogICAgICAgICAjIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fY3J1ZG8gPSByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uLA0KICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8sIHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50KSANCg0KDQoNCg0KZ3JhZl9kaWZfY3J1ZG8gPC0gcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gJT4lDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZShyZW50YV9kaWZfcHJlY2lvc19jcnVkbyA9IHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvL2lwY18xOCwNCiAgICAgICAgIHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50ID0gcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQvaXBjXzE4KSAlPiUgDQogIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIHNlbGVjdChhbmlvLCAxMjpuY29sKC4pICkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOjQpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgLyAxMF42KSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIHBldHJvbGVyYSBwb3IgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vIHkgZXh0ZXJubyIsDQogICAgICAgeSA9ICJNTSBkZSBwZXNvcyBkZSAyMDE4IikNCmdyYWZfZGlmX2NydWRvDQoNCg0KDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgPC0gcHJvZF9tZXJnZV9nYXNfTU1CVFUgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcm9kX2dhcykgJT4lIA0KICBsZWZ0X2pvaW4oZXhwb19xX2dhc19NTUJUVSAlPiUgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhwb19nYXMpKSAlPiUgDQogIG11dGF0ZShleHBvX2dhcyA9IHJlcGxhY2VfbmEoZXhwb19nYXMsIDAgKSwNCiAgICAgICAgcHJvZF9tZG9faW50ZXJubyA9IHByb2RfZ2FzIC0gZXhwb19nYXMpICU+JQ0KICBsZWZ0X2pvaW4ocHJlY2lvX21pX2dhc19NTUJUVSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8gLCBwcmVjaW9faW50ZXJub19nYXMgPSAgcHJlY2lvX2dhc19tZG9pbnQpLA0KICAgICAgICAgICAgYnkgPSAiYW5pbyIpICU+JSAgIyB1bm8gY29uIHByZWNpbyBpbnRlcm5vDQogIGxlZnRfam9pbihwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwcmVjaW9fZXh0ZXJub19nYXMpLCANCiAgICAgICAgICAgIGJ5ID0gImFuaW8iKSAlPiUgICAjIHVubyBjb24gcHJlY2lvIGV4dGVybm8NCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lDQogIG11dGF0ZSgNCiAgICBwcmVjaW9faW50ZXJub19nYXMgPSBwcmVjaW9faW50ZXJub19nYXMvIHRjYywNCiAgICByZW50YV9kaWZfcHJlY2lvc19nYXMgPSBwcm9kX21kb19pbnRlcm5vICogdGNwICogcHJlY2lvX2V4dGVybm9fZ2FzDQogICAgICAtIHByb2RfbWRvX2ludGVybm8gKiB0Y2MgKiBwcmVjaW9faW50ZXJub19nYXMgLA0KICAgIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24gPSBwcm9kX21kb19pbnRlcm5vICogcHJlY2lvX2ludGVybm9fZ2FzKih0Y3AvdGNjLTEpLA0KICAgICAgdW5pZGFkX3ByZWNpbyA9ICJVU0QiLCB1bmlkYWRfcmVudGEgPSAiUGVzb3MgY29ycmllbnRlcyIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50aWRhZD0gdW5pZGFkICwgcHJvZF9nYXMsIGV4cG9fZ2FzLCBwcm9kX21kb19pbnRlcm5vLCANCiAgICAgICAgIHVuaWRhZF9wcmVjaW8sIHByZWNpb19pbnRlcm5vX2dhcywgcHJlY2lvX2V4dGVybm9fZ2FzLCB0Y2MsIHRjcCwNCiAgICAgICAgIHVuaWRhZF9yZW50YSwgcmVudGFfZGlmX3ByZWNpb3NfZ2FzLCByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uX2dhcyA9IHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24gKQ0KcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMNCg0KDQoNCmdyYWZfZGlmX2dhcyA8LSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZShyZW50YV9kaWZfcHJlY2lvc19nYXMgPSByZW50YV9kaWZfcHJlY2lvc19nYXMvaXBjXzE4LA0KICAgICAgICAgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMgPSANCiAgICAgICAgICAgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMvaXBjXzE4KSAlPiUNCiAgICBzZWxlY3QoYW5pbywgMTE6bmNvbCguKSApICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMzo0KSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yIC8gMTBeNikgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHRpcG9fcmVudGEsIGZpbGwgPSB0aXBvX3JlbnRhKSkrDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBnYXPDrWZlcmEgcG9yIGRpZmVyZW5jaWFsIGRlIHByZWNpb3MgaW50ZXJubyB5IGV4dGVybm8iLA0KICAgICAgIHkgPSAiTU0gZGUgcGVzb3MgZGUgMjAxOCIpKw0KICB4bGltKDE5NjAsIDIwMjEpDQpncmFmX2RpZl9nYXMNCg0KDQoNCmBgYA0KDQojIFJlbnRhIGFwcm9waWFkYSBwb3Igc29icmV2YWx1YWNpw7NuIGNhbWJpYXJpYQ0KDQoNCiQkUnNvYnJldmFsdWFjaW9uID0gRXhwbyAqIFBleHQgKiAoVENQIC0gVENDKSQkIA0KDQpEb25kZToNCiogJFJzb2JyZXZhbHVhY2lvbiQgPSBSZW50YSBhcHJvcGlhZGEgcG9yIGV4cG9ydGFjaW9uZXMgY29uIHRpcG8gZGUgY2FtYmlvIHNvYnJldmFsdWFkbw0KKiAkRXhwbyQgPSBFeHBvcnRhY2lvbmVzICAoYmFycmlsZXMgZGUgcGV0csOzbGVvIMOzIE1NQlRVKQ0KKiAkUGV4dCQgPSBQcmVjaW8gZGUgcmVmZXJlbmNpYSBkZWwgbWVyY2FkbyBleHRlcm5vIChVU0QpDQoqICRUQ1AkID0gVGlwbyBkZSBDYW1iaW8gZGUgUGFyaWRhZA0KKiAkVENDJCA9IFRpcG8gZGUgQ2FtYmlvIENvbWVyY2lhbA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcmVudGFfdGNwX2NydWRvIDwtICByZW50YV9kaWZfcHJlY2lvc19jcnVkbyAlPiUNCiAgbGVmdF9qb2luKGV4cG9fdXNkX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fY3J1ZG9fdXNkID0gZXhwb19jcnVkbywgdW5pZGFkX2V4cG8gPSB1bmlkYWQgKSkgJT4lIA0KICAgbXV0YXRlKHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvID0gZXhwb19jcnVkbypwcmVjaW9fZXh0ZXJub19jcnVkbyp0Y3AgLSBleHBvX2NydWRvKnByZWNpb19leHRlcm5vX2NydWRvKnRjYywNCiAgICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkb192YWxvciA9IGV4cG9fY3J1ZG9fdXNkKiB0Y3AgLSBleHBvX2NydWRvX3VzZCogdGNjLCANCiAgICAgICAgIHVuaWRhZF9wcmVjaW8gPSAiVVNEIiwgdW5pZGFkX3JlbnRhID0gIlBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgZGlmID0gcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8vcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG9fdmFsb3ItMSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRpZGFkICwgZXhwb19jcnVkbywNCiAgICAgICAgIHVuaWRhZF9leHBvLCBleHBvX2NydWRvX3VzZCwNCiAgICAgICAgIHVuaWRhZF9wcmVjaW8sIHByZWNpb19leHRlcm5vX2NydWRvICwNCiAgICAgICAgICB0Y2MsIHRjcCwgdW5pZGFkX3JlbnRhLA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8sIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvX3ZhbG9yLCBkaWYpICANCnJlbnRhX3RjcF9jcnVkbw0KDQpyZW50YV90Y3BfZ2FzIDwtICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyAlPiUgDQogICBtdXRhdGUocmVudGFfc29icmV2YWx1YWNpb25fZ2FzID0gZXhwb19nYXMqcHJlY2lvX2V4dGVybm9fZ2FzKnRjcCAtIGV4cG9fZ2FzKnByZWNpb19leHRlcm5vX2dhcyp0Y2MsDQogICAgICAgICB1bmlkYWRfcHJlY2lvID0gIlVTRCIsIHVuaWRhZF9yZW50YSA9ICJQZXNvcyBjb3JyaWVudGVzIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRpZGFkICwgZXhwb19nYXMsIA0KICAgICAgICAgdW5pZGFkX3ByZWNpbywgcHJlY2lvX2V4dGVybm9fZ2FzICwNCiAgICAgICAgICB0Y2MsIHRjcCwgdW5pZGFkX3JlbnRhLA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzKSAgDQoNCg0KDQpgYGANCg0KDQoNCiMgUmVudGEgYXByb3BpYWRhIHBvciBlbCBFc3RhZG8gbWVkaWFudGUgaW1wdWVzdG9zIGVzcGVjw61maWNvcw0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQpyZXRlbmNpb25lc19jYW1wb2RvbmljbyA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9yZXRlbmNpb25lcy54bHN4IiAsIA0KICAgIHNoZWV0ID0gInVzZCIpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbCAlPiUgc2VsZWN0KC1UQ1ApKSAlPiUgDQogIG11dGF0ZShyZXRlbmNpb25lc19oYyA9IHJldGVuY2lvbmVzX2hnICogVENDICogMTAwMDAwMCwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHJldGVuY2lvbmVzX2hjKQ0KDQpyZXRlbmNpb25lc19jcnVkbyA8LSByZWFkX2V4Y2VsKCAiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvcmV0ZW5jaW9uZXMueGxzeCIgKSAlPiUNCiAgcmVuYW1lKHJldGVuY2lvbmVzX2NydWRvX2prID0gcmV0ZW5jaW9uZXNfamssDQogICAgICAgICByZXRlbmNpb25lc19jcnVkb19iZnIgPSAicmV0ZW5jaW9uZXNfYmZyX00kMjAwOCIpICU+JSANCiAgbXV0YXRlKHJldGVuY2lvbmVzX2NydWRvX2JmciA9IHJldGVuY2lvbmVzX2NydWRvX2JmciAqIGlwYzA4X2JmciAqIDEwMDAgLA0KICAgICAgICAgdW5pZGFkID0gImFycyIpICU+JSANCiAgc2VsZWN0KC1pcGMwOF9iZnIpICU+JSANCiAgbGVmdF9qb2luKHJldGVuY2lvbmVzX2NhbXBvZG9uaWNvKQ0KDQoNCnJlbnRlbmNpb25lc19yZWdhbGlhcyA8LSByZWdhbGlhcyAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UocmVnYWxpYXNfdG90YWwgPSBzdW0ocmVnYWxpYXNfdG90YWwsIG5hLnJtID0gVCkpICU+JSANCiAgbGVmdF9qb2luKHJldGVuY2lvbmVzX2NydWRvICU+JSBzZWxlY3QoLWMocmV0ZW5jaW9uZXNfY3J1ZG9fYmZyLCByZXRlbmNpb25lc19oYykpKSANCg0KDQoNCnJldGVuY2lvbmVzX2NydWRvDQoNCg0KYGBgDQoNCg0KDQoNCiQkUmltcCA9IFJFICsgUmVnJCQNCg0KRG9uZGU6DQoNCiogJFJpbXAkID0gUmVudGEgYXByb3BpYWRhIHBvciBlbCBFc3RhZG8gbWVkaWFudGUgaW1wdWVzdG9zIGVzcGVjw61maWNvcw0KKiAkUkUkID0gUmV0ZW5jaW9uZXMNCiogJFJlZyQgPSBSZWdhbGlhcw0KDQojIFJlbnRhIGFwcm9waWFkYSBwb3IgY29uc3VtaWRvcmVzIHkgcmVmaW5lcsOtYXMgeSBwcm9jZXNhZG9yYXMNCg0KIyMjIENyaXRlcmlvIGRlIGPDs21wdXRvIGRlIFJhbcOzbiAoMjAxOSkNCg0KIyMjIyBSZWZpbmVyw61hcyB5IHByb2Nlc2Fkb3Jhcw0KDQokJFJSID0gKFBJIC0gUFJNaSkgKiBDcnVkb1AkJA0KDQoNCg0KKiAkUlIkID0gUmVudGEgYXByb3BpYWRhIHBvciBsYXMgUmVmaW5hZG9yYXMgDQoqICRQSSQgPSBwcm9tZWRpbyBwb25kZXJhZG8gZGUgUHJlY2lvcyBJbnRlcm5hY2lvbmFsZXMgDQoqICRQUk1pJCA9IFByZWNpbyBwb25kZXJhZG8gYSBSZWZpbmVyw61hcyBkZWwgTWVyY2FkbyBJbnRlcm5vDQoqICRDcnVkb1AkID0gYmFycmlsZXMgZGUgQ3J1ZG8gUHJvY2VzYWRvIHBvciBsYXMgcmVmaW5hZG9yYXMNCg0KIyMjIyBDb25zdW1pZG9yZXMNCg0KJCRSQyA9IChQSSAtIFBSTWkgLSBNUikgKiBDcnVkb1AgJCQNCg0KKiAkUkMkID0gUmVudGEgYXByb3BpYWRhIHBvciBsb3MgQ29uc3VtaWRvcmVzDQoqICRNUiQgPSBNYXJnZW4gZGUgUmVmaW5lcsOtYXMNCg0KRXN0byByZXN1bHRhIGVxdWl2YWxlbnRlIGEgcGxhbnRlYXI6DQoNCiQkUkMgPSBQQ01pICogQ3J1ZG9QJCQNCg0KKiAkUENNaSQgPSBQcmVjaW8gcG9uZGVyYWRvIGEgQ29uc3VtaWRvcmVzIGRlbCBNZXJjYWRvIEludGVybm8uDQoNCg0KDQoNCiMgUmVudGEgSGlkcm9jYXJidXLDrWZlcmEgVG90YWwuIEVuIHByZWNpb3MgY29uc3RhbnRlcywgc29icmUgUGx1c3ZhbMOtYSBUb3RhbCB5IFBCSQ0KDQpFeGlzdGVuIGRvcyBjYW1pbm9zIHBhcmEgbGxlZ2FyIGFsIG1vbnRvIHRvdGFsIGRlIHJlbnRhIGRlIGxhIHRpZXJyYSBoaWRyb2NhcmJ1csOtZmVyYTogdW5vIGVzIGRlc2NvbnRhbmRvIGxhIGdhbmFuY2lhIG5vcm1hbCBkZSBsYXMgZW1wcmVzYXMgYSBsYSBwbHVzdmFsw61hIHRvdGFsIGRlbCBzZWN0b3IgeSBlbCBvdHJvIGVzIHBvciBtZWRpbyBkZSBsYSBzdW1hIGRlIG1lY2FuaXNtb3MgZGUgYXByb3BpYWNpw7NuLg0KDQokJFJlbnRhXF9oaWRyb2NhcmJ1csOtZmVyYSA9IFBWX3toaWRyb2NhcmJ1csOtZmVyYX0gLSBHY2lhXF9Ob3JtYWxfe2hpZHJvY2FyYnVyw61mZXJhfSQkDQpEb25kZToNCg0KKiAkR2NpYVxfTm9ybWFsX3toaWRyb2NhcmJ1csOtZmVyYX0kID0gR2FuYW5jaWEgTm9ybWFsIGRlbCBzZWN0b3IgaGlkcm9jYXJidXLDrWZlcm8NCiogJFBWX3toaWRyb2NhcmJ1csOtZmVyYX0kID0gUGx1c3ZhbMOtYSBkZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvICANCg0KJCRHY2lhXF9Ob3JtYWxfe2hpZHJvY2FyYnVyw61mZXJhfSA9IEtUQV97aGlkcm9jYXJidXLDrWZlcm99ICogVEdfe3JlZmVyZW5jaWF9JCQNCg0KDQpEb25kZToNCg0KKiAkS1RBX3toaWRyb2NhcmJ1cm9zfSQgPSBTdG9jayBkZSBjYXBpdGFsIGFkZWxhbnRhZG8gZGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybyANCiogJFRHX3tyZWZlcmVuY2lhfSQgPSBUYXNhIGRlIGdhbmFuY2lhIG5vcm1hbCBkZSByZWZlcmVuY2lhLg0KDQpFbiBlc3RlIGNhc28sIHNlbGVjY2lvbmFtb3MgbGEgdGFzYSBkZSBnYW5hbmNpYSBkZWwgc2VjdG9yIGluZHVzdHJpYWwgY29tbyBwYXLDoW1ldHJvIHBhcmEgZGlmZXJlbmNpYXIgbGEgcmVudGEgZGUgbGEgZ2FuYW5jaWEuIEEgc3UgdmV6LCBwYXJhIGVsIGNhcGl0YWwgdG90YWwgYWRlbGFudGFkbyBkZSBsYXMgZW1wcmVzYXMgaGlkcm9jYXJidXLDrWZlcmFzLCBzZWxlY2Npb25hbW9zIHVuaWNhbWVudGUgZWwgdmFsb3IgcmVzdWx0YW50ZSBkZSBsYSBlc3RpbWFjacOzbiBkZSBsYSBQUHlFIGRlIEJvbHNhciBhIHBhcnRpciBkZWwgaW5kaWNlIGRlIGZsdWpvIGRlIHBvem9zICh2YXJpYWJsZSAicHB5ZV9ib2xzYXJfZmx1am8iKSwgcG9yIGxvIHF1ZSBsZSBmYWx0YW4gbG9zIGludmVudGFyaW9zIHkgc2FsYXJpb3MgYWRlbGFudGFkb3MuDQoNCkVsIGPDoWxjdWxvIGRlIHJlbnRhIHRvdGFsIGhpZHJvY2FyYnVyw61mZXJhIHF1ZSBzZSBvYnRpZW5lIHBvciBtZWRpbyBkZSBkZXNjb250YXIgbGEgZ2FuYW5jaWEgbm9ybWFsIGEgbGEgcGx1c3ZhbMOtYSB0b3RhbCBkZWwgc2VjdG9yLCBkZWJlIHNlciBpZ3VhbCBhIGxhIHJlbnRhIG9idGVuaWRhIHBvciBtZWRpbyBkZSBsYSBhZ3JlZ2FjacOzbiBkZSBsb3MgZGlzdGludG9zIG1lY2FuaXNtb3MgZGUgYXByb3BpYWNpw7NuLiBFcyBkZWNpcjoNCg0KJCRSZW50YVxfaGlkcm9jYXJidXLDrWZlcmEgPSBSZW50YVxfZGlmZXJlbmNpYWxcX3ByZWNpb3MgKyBSZW50YVxfc29icmV2YWx1YWNpw7NuICsgUmVudGFcX2VtcHJlc2FzICsgSW1wdWVzdG9zXF9uZXRvc1xfZXNwZWPDrWZpY29zICQkDQokJEltcHVlc3Rvc1xfbmV0b3NcX2VzcGVjw61maWNvcyA9IFJldGVuY2lvbmVzICsgUmVnYWzDrWFzIC0gU3Vic2lkaW9zJCQNCg0KIyMgTcOpdG9kbyBkaXJlY3RvIChhIHBhcnRpciBkZSBkZXNjdWVudG9zIHNvYnJlIGVsIFZCUCkNCg0KYGBge3IgZWNobz1GQUxTRX0NCiMga25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89IFRSVUUsZmlnLndpZHRoID0gMTIwLGZpZy5oZWlnaHQgPSA0MDApDQpyZW50YV9kaXJlY3RvIDwtIHJlbnRhX3RnICU+JSANCiAgc2VsZWN0KGFuaW8sIHBweWUgLCAjZXMgc3RvY2sgZGUgYm9sc2FyDQogICAgICAgICB0Z19oaWRyb2NhcmJ1cm9zLCB0Z19ub3JtYWwgPSB1bmlvbl90ZykgJT4lIA0KICBsZWZ0X2pvaW4oY3JpdGVyaW9fcHJvcGlvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBwdikgKSU+JSANCiAgbGVmdF9qb2luKHN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zICU+JSANCiAgICAgICAgICAgICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCksIGJ5ID0iYW5pbyIpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUoc3Vic2lkaW9zID0gKHN1YnNpZGlvc19lamVzLzEwXjYpL2lwY18xOCwgDQogICAgICAgICAgICAgICAgICAgICBzdWJzaWRpb3MgPXJlcGxhY2VfbmEoc3Vic2lkaW9zLCAwKSApICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHN1YnNpZGlvcykpICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCksIGJ5ID0iYW5pbyIpICU+JSANCiAgbXV0YXRlKHJlbnRhX2Nvbl90Z19ub3JtYWwgPSBwcHllKiAodGdfaGlkcm9jYXJidXJvcyAtIHRnX25vcm1hbCksDQogICAgICAgICBnY2lhX25vcm1hbF9oaWRyb2NhcmJ1cm9zID0gcHB5ZSAqIHRnX25vcm1hbCwNCiAgICAgICAgIHJlbnRhX3RvdGFsID0gKHB2L2lwY18xOCkgLSBnY2lhX25vcm1hbF9oaWRyb2NhcmJ1cm9zIC1zdWJzaWRpb3MsDQogICAgICAgICAjIHByb3BvcmNpb25fc3Vic2lkaW9zID0gc3Vic2lkaW9zLw0KICAgICAgICAgIyAgIChwdiAtIGdjaWFfbm9ybWFsX2hpZHJvY2FyYnVyb3MpLA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSAlPiUgDQogIHNlbGVjdChhbmlvICwgaXBjXzE4LCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLiksIC1yZW50YV9jb25fdGdfbm9ybWFsKSAlPiUgI3NhY28gcmVudGFfY29uX3RnX25vcm1hbCBwb3Igbm8gdXNvDQogIGZpbHRlcihhbmlvID4xOTk3KQ0KcmVudGFfZGlyZWN0bw0KDQpyZW50YV9kaXJlY3RvICU+JQ0KICBmaWx0ZXIoYW5pbyA+MTk2MCkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHJlbnRhX3RvdGFsKSkrIA0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCBhIHBhcnRpciBkZSBlc3RpbWFjacOzbiBwcm9waWEgZGVsIFZCUCIsDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQ0KDQoNCg0KcmVudGFfZGlyZWN0b19wYmkgPC0gcmVudGFfZGlyZWN0byAlPiUgDQogIGxlZnRfam9pbihnYW5hbmNpYV95X3BiaSAlPiUgcmVuYW1lKHVuaWRhZF9wYmlfZ2NpYSA9IHVuaWRhZCksICBieSA9ICJhbmlvIikgJT4lIA0KICAjIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpLCAgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHJlbnRhX3B2ID0ocmVudGFfdG90YWwqaXBjXzE4ICkvZ2FuYW5jaWEsIA0KICAgICAgICAgcmVudGFfcGJpID0ocmVudGFfdG90YWwqaXBjXzE4ICkvcGJpICkNCg0KDQpncmFmX3JlbnRhX2RpcmVjdG9fcGJpIDwtIHJlbnRhX2RpcmVjdG9fcGJpICU+JSANCiAgc2VsZWN0KGFuaW8sIHJlbnRhX3B2LHJlbnRhX3BiaSApICU+JQ0KICAjIGZpbHRlcihhbmlvID49IDE5NjIsIGZ1ZW50ZV9nY2lhID09ICJQcm9waWEiKSAlPiUNCiAgZmlsdGVyKGFuaW8gPj0gMTk2MikgJT4lDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6MykgJT4lDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IpKSsNCiAgIyBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICBnZW9tX2xpbmUoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgc29icmUgUEJJIHkgR2FuYW5jaWFzIFRvdGFsZXMiLA0KICAgICAgIHN1YnRpdGxlID0gIkEgcGFydGlyIGRlIGVzdGltYWNpw7NuIHByb3BpYSBkZWwgVkJQIiwNCiAgICAgICB5ID0gIiUiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMikpKw0KICBmYWNldF9ncmlkKH50aXBvX3JlbnRhICkNCg0KIyBncmFmX3JlbnRhX2RpcmVjdG9fcGJpDQpnZ3Bsb3RseShncmFmX3JlbnRhX2RpcmVjdG9fcGJpLCBoZWlnaHQgPSA0MDAsIHdpZHRoID0gNjAwKQ0KDQpgYGANCg0KDQojIyBNw6l0b2RvIGluZGlyZWN0byAoc3VtYSBkZSBtZWNhbmlzbW9zKQ0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcmVudGFfaW5kaXJlY3RvIDwtIHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvICU+JSANCiAgIyBzZWxlY3QoYW5pbyxyZW50YV9kaWZfcHJlY2lvc19jcnVkbywgcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQgKSAlPiUNCiAgc2VsZWN0KGFuaW8scmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gKSAlPiUNCiAgbGVmdF9qb2luKHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzICU+JSBzZWxlY3QoYW5pbywgcmVudGFfZGlmX3ByZWNpb3NfZ2FzKSApICU+JSANCiAgbGVmdF9qb2luKHJlbnRlbmNpb25lc19yZWdhbGlhcyAlPiUgc2VsZWN0KC11bmlkYWQpICU+JSANCiAgICAgICAgICAgICAgcmVuYW1lKHJldGVuY2lvbmVzID0gcmV0ZW5jaW9uZXNfY3J1ZG9famspKSAlPiUgDQogIGxlZnRfam9pbihyZW50YV90Y3BfY3J1ZG8gJT4lIHNlbGVjdChhbmlvLCByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbykpICU+JSANCiAgbGVmdF9qb2luKHJlbnRhX3RjcF9nYXMgJT4lIHNlbGVjdChhbmlvLCByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMpKSAlPiUgDQogICBsZWZ0X2pvaW4oc3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgc3Vic2lkaW9zID0gc3Vic2lkaW9zX2VqZXMpLCBieSA9ImFuaW8iKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8gKSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3ggLyAxMF42fSkgJT4lICNsYXMgdmJsZXMgY2FyZ2FkYXMgYW50ZXJpb3JtZW50ZSBzZSBwYXNhbiBhIE1NDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkgcmVwbGFjZV9uYSh4LCAwKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBsZWZ0X2pvaW4ocmVudGFfcHJvZHVjY2lvbl9iYWxhbmNlcyAlPiUgc2VsZWN0KGFuaW8sIHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zKSkgJT4lDQogICMgbGVmdF9qb2luKHJlbnRhX2RpcmVjdG8gJT4lDQogICMgICAgICAgICAgICAgZmlsdGVyKHN0b2NrX3NlbGVjY2lvbmFkbyA9PSAicHB5ZV9ib2xzYXIiKSAlPiUNCiAgIyAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcmVudGFfZW1wcmVzYXMgPSByZW50YV9jb25fdGdfbm9ybWFsKSAlPiUgDQogICMgICAgICAgICAgICAgbXV0YXRlKHJlbnRhX2VtcHJlc2FzID0gMCkpICU+JQ0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IpICU+JSANCiAgbGVmdF9qb2luKGdhbmFuY2lhX3lfcGJpICU+JSByZW5hbWUodW5pZGFkX3BiaV9nY2lhID0gdW5pZGFkKSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lIA0KICBtdXRhdGUoDQogICAgcmVudGFfZGlmX3ByZWNpb3NfZ2FzID0gcmVudGFfZGlmX3ByZWNpb3NfZ2FzIC9pcGNfMTgsDQogICAgICAgICByZW50YV9kaWZfcHJlY2lvc19jcnVkbyA9IHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvIC8gaXBjXzE4LA0KICAgICAgICAgIyByZW50YV9kaWZfcHJlY2lvc19icmVudCA9IHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50IC9pcGNfMTgsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyA9IHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvL2lwY18xOCwNCiAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyA9IHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcy9pcGNfMTgsDQogICAgICAgICByZWdhbGlhc190b3RhbCA9IHJlZ2FsaWFzX3RvdGFsIC8gaXBjXzE4LA0KICAgICAgICAgcmV0ZW5jaW9uZXMgPSByZXRlbmNpb25lcyAvIGlwY18xOCwgDQogICAgICAgICBzdWJzaWRpb3MgPSBzdWJzaWRpb3MvaXBjXzE4LA0KICAgIHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zID1yZXBsYWNlX25hKHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zLCAgMCksDQogICAgICAgICByZW50YV9lbXByZXNhc19kZXNwX2ltcHVlc3RvcyA9IHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zL2lwY18xOCwNCiAgICAgICAgIHJlbnRhX3RvdGFsID0gcmVudGFfZGlmX3ByZWNpb3NfZ2FzKyByZW50YV9kaWZfcHJlY2lvc19jcnVkbyArDQogICAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvICsgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzICsNCiAgICAgICAgICAgcmVudGFfZW1wcmVzYXNfZGVzcF9pbXB1ZXN0b3MrDQogICAgICAgICAgIHJlZ2FsaWFzX3RvdGFsICsgIHJldGVuY2lvbmVzIC0gc3Vic2lkaW9zLA0KICAgICAgICAgcHJvcG9yY2lvbl9zdWJzaWRpb3MgPSBzdWJzaWRpb3MvKHJlbnRhX2RpZl9wcmVjaW9zX2dhcysgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gKw0KICAgICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyArIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyArDQogICAgICAgICAgIHJlZ2FsaWFzX3RvdGFsICsgIHJldGVuY2lvbmVzKSAgLA0KICAgICAgICAgcmVudGFfcHYgPSAocmVudGFfdG90YWwqaXBjXzE4KS9nYW5hbmNpYSwNCiAgICAgICAgIHJlbnRhX3BiaSA9IChyZW50YV90b3RhbCppcGNfMTgpL3BiaSwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IiwNCiAgICAgICAgIHJlbnRhX3VzZF90Y2MgPSAocmVudGFfdG90YWwqaXBjXzE4KSAvIHRjYywgDQogICAgICAgICByZW50YV91c2RfdGNwID0gKHJlbnRhX3RvdGFsKmlwY18xOCkgLyB0Y3AsKSAgJT4lIA0KICByZW5hbWUocmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgPSByZW50YV9kaWZfcHJlY2lvc19nYXMsDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvID0gcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8sDQogICAgICAgICAjIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfYnJlbnQgPSByZW50YV9kaWZfcHJlY2lvc19icmVudCwNCiAgICAgICAgIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2NydWRvID0gcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gLA0KICAgICAgICAgcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfZ2FzID0gcmVudGFfc29icmV2YWx1YWNpb25fZ2FzLCkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBpcGNfMTgsdGNjLHRjcCwgZXZlcnl0aGluZyguKSAsIC1zb2JyZXZhbHVhY2lvbikgJT4lIA0KICAjIHNlbGVjdCgtcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8pDQogICMgc2VsZWN0KC1yZW50YV9kaWZfcHJlY2lvc19icmVudCkgJT4lIA0KICBkaXN0aW5jdCgpDQoNCg0KI1JlbnRhIHRvdGFsDQpncmFmX3JlbnRhX3RvdGFsIDwtIHJlbnRhX2luZGlyZWN0byAlPiUNCiAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiAgc2VsZWN0KC1jKHVuaWRhZCwgaXBjXzE4LCByZW50YV90b3RhbCwgdGNjLCB0Y3AsDQogICAgICAgICAgICBzdWJzaWRpb3MsIHByb3BvcmNpb25fc3Vic2lkaW9zKSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAyOjgpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB0aXBvX3JlbnRhLCBmaWxsID0gdGlwb19yZW50YSkpKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJzdGFjayIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgKHBldHLDs2xlbyB5IGdhcykiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJDdXJzb3MgZGUgYXByb3BpYWNpw7NuLiBNaWxsb25lcyBwZXNvcyBkZSAyMDE4IiwgDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyAyMDE4IikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKSsNCiAgdGhlbWVfY2xhc3NpYygpDQoNCmdncGxvdGx5KGdyYWZfcmVudGFfdG90YWwsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCiMgcHJvcG9yY2lvbiBzdWJzaWRpb3MNCiMgcmVudGFfaW5kaXJlY3RvWyxjKCJhbmlvIiwicHJvcG9yY2lvbl9zdWJzaWRpb3MiKV0gJT4lIGFycmFuZ2UoLWFuaW8pDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KI1JlbnRhIHRjcCB5IHRjYw0KZ3JhZl9yZW50YV90b3RhbF91c2QgPC0gcmVudGFfaW5kaXJlY3RvICU+JSANCiAgc2VsZWN0KGMoYW5pbywgcmVudGFfdXNkX3RjYywgcmVudGFfdXNkX3RjcCkpICU+JQ0KICBmaWx0ZXIoYW5pbyA+IDE5NjIpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjozKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB0aXBvX3JlbnRhKSApKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgKHBldHLDs2xlbyB5IGdhcykiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJNaWxsb25lcyBkZSBVU0QiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKQ0KZ2dwbG90bHkoZ3JhZl9yZW50YV90b3RhbF91c2QsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCg0KDQoNCiNjb21wYXJhY2lvbiBjb24gRlINCmdyYWZfY29tcGFyYWNpb25fcmVudGFzIDwtIHJlbnRhX2luZGlyZWN0byAlPiUgDQogIG11dGF0ZShmdWVudGUgPSAiUHJvcGlhIHZpYSBzdW1hIGRlIG1lY2FuaXNtb3MiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsZnVlbnRlLCAgcmVudGFfdG90YWwgKSAlPiUgDQogIGJpbmRfcm93cyhyZW50YV9kaXJlY3RvX3BiaSAlPiUgDQogICAgICAgICAgICAgICAgbXV0YXRlKGZ1ZW50ZSA9ICJQcm9waWEgdmlhIGRlc2N1ZW50b3Mgc29icmUgVkJQIikgJT4lIA0KICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sZnVlbnRlLCAgcmVudGFfdG90YWwgKSApICU+JSANCiAgYmluZF9yb3dzKHJlbnRhX2hpZHJvY2FyYnVyb3NfZnIgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoZnVlbnRlID0gIkbDoXJmYXJvIFJ1aXogeSBCaWxsIikgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIGZ1ZW50ZSwgIHJlbnRhX3RvdGFsKSkgJT4lIA0KICBmaWx0ZXIoYW5pbyA+PSAxOTYyKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCByZW50YV90b3RhbCwgY29sb3IgPSBmdWVudGUpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjM1KSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIChwZXRyw7NsZW8geSBnYXMpIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIGVzdGltYWNpb25lcy4gTWlsbG9uZXMgcGVzb3MgZGUgMjAxOCIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpKw0KICB0aGVtZV9jbGFzc2ljKCkNCmdyYWZfY29tcGFyYWNpb25fcmVudGFzDQoNCg0KI3NvYnJlIHBiaSB5IHB2DQpncmFmX3JlbnRhX3RvdGFsX3B2IDwtIHJlbnRhX2luZGlyZWN0byAlPiUgDQogIHNlbGVjdChhbmlvLCByZW50YV9wdixyZW50YV9wYmkgKSAlPiUNCiAgZmlsdGVyKGFuaW8gPj0gMTk2MikgJT4lDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6MykgJT4lDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIHNvYnJlIFBCSSB5IEdhbmFuY2lhcyBUb3RhbGVzIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJTdW1hIGRlIG1lY2FuaXNtb3MiLA0KICAgICAgIHkgPSAiJSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6cGVyY2VudCkNCg0KDQpnZ3Bsb3RseShncmFmX3JlbnRhX3RvdGFsX3B2LCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCg0KI3NvbG8gcmVudGEgZW1wcmVzYXMNCiMgcmVudGFfaW5kaXJlY3RvICU+JQ0KIyAgIGZpbHRlcihhbmlvID4gMTk2MCkgJT4lIA0KIyAgIG11dGF0ZShyZW50YV9lbXByZXNhc19wdiA9IHJlbnRhX2VtcHJlc2FzKmlwY18xOC9nYW5hbmNpYSwNCiMgICAgICAgICAgcmVudGFfZW1wcmVzYXNfcGJpID0gcmVudGFfZW1wcmVzYXMqaXBjXzE4L3BiaSkgJT4lIA0KIyAgIHNlbGVjdChhbmlvLCByZW50YV9lbXByZXNhc19wdiwgcmVudGFfZW1wcmVzYXNfcGJpKSAlPiUgDQojICAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLCB2YWx1ZSA9IHZhbG9yLCAyOjMgKSAlPiUgDQojICAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgZmlsbCA9IHZhcmlhYmxlKSkrDQojICAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiMgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQojICAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSBhcHJvcGlhZGEgcG9yIGVtcHJlc2FzIHNvYnJlIFBCSSB5IEdhbmFuY2lhcyBUb3RhbGVzIiwNCiMgICAgICAgIHkgPSAiJSIpKw0KIyAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpwZXJjZW50KQ0KDQogIA0KYGBgDQoNCg0KYGBge3J9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyBzb2xvIGdhcw0KIyBHYXMNCiMgcmVudGFfZ2FzX3BiaV9wdiA8LSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyAlPiUgDQojICAgc2VsZWN0KGFuaW8scmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMsIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzICkgJT4lIA0KIyAgIGdyb3VwX2J5KGFuaW8gKSAlPiUgDQojICAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eCAvIDEwXjZ9KSAlPiUgDQojICAgbGVmdF9qb2luKGdhbmFuY2lhX3lfcGJpKSAlPiUgDQojICAgbXV0YXRlKHJlbnRhX2RpZl9wcmVjaW9zX2dhc19wdiA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcy9nYW5hbmNpYSwNCiMgICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfZ2FzX3BiaSA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcy9wYmksDQojICAgICAgICAgIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzX3B2ID0gcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9nYXMvZ2FuYW5jaWEsDQojICAgICAgICAgIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzX3BiaSA9IHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzL3BiaSwNCiMgICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIFBlc29zIGNvcnJpZW50ZXMiKQ0KIyANCiMgZ3JhZl9yZW50YV9nYXNfcHYgPC0gcmVudGFfZ2FzX3BiaV9wdiAlPiUgDQojICAgc2VsZWN0KGFuaW8sIDc6bmNvbCguKSApICU+JSANCiMgICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiMgICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiMgICAgICAgICAgMjpuY29sKC4pKSAlPiUgDQojICAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB0aXBvX3JlbnRhLCBmaWxsID0gdGlwb19yZW50YSkpKw0KIyAgIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KIyAgIGxhYnModGl0bGUgPSAiUmVudGEgcGV0cm9sZXJhIHBvciBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zIGludGVybm8geSBleHRlcm5vIHNvYnJlIFBCSSB5IEdhbmFuY2lhcyBUb3RhbGVzIiwNCiMgICAgICAgIHkgPSAiJSIpDQojIHBsb3RseTo6Z2dwbG90bHkoZ3JhZl9yZW50YV9nYXNfcHYpDQpgYGANCg0KIyMgQ29zdG9zDQoNCiQkUVxfdG90YWwgPSBRX3twZXRyw7NsZW99ICsgUV97Z2FzfSAkJA0KRG9uZGU6DQogIA0KICAqICRRXF90b3RhbCQgPSBDYW50aWRhZGVzIHByb2R1Y2lkYXMgZGUgcGV0csOzbGVvIHkgZ2FzIGVuIEJhcnJpbGVzIEVxdWl2YWxlbnRlcyBkZSBQZXRyw7NsZW8NCiAgKiAkUV97cGV0csOzbGVvfSQgPSBDYW50aWRhZGVzIHByb2R1Y2lkYXMgZGUgcGV0csOzbGVvIGNydWRvIGVuIGJhcnJpbGVzIGVxdWl2YWxlbnRlcyBkZSBwZXRyw7NsZW8gKEJPRSkNCiAgKiAkUV97Z2FzfSQgPSBDYW50aWRhZGVzIHByb2R1Y2lkYXMgZGUgZ2FzIG5hdHVyYWwgZW4gYmFycmlsZXMgZXF1aXZhbGVudGVzIGRlIHBldHLDs2xlbyAoQk9FKQ0KICANCg0KJCQgQ29zdG9zXF90b3RhbGVzID0gIENJICsgTVMgKyBDb25LZmlqbyQkDQoNCkRvbmRlOg0KDQoqICRDb3N0b3NcX3RvdGFsZXMkID0gQ29zdG9zIHRvdGFsZXMgaGlkcm9jYXJidXLDrWZlcm9zDQoqICRDSSQgPSBDb25zdW1vIEludGVybWVkaW8sIGRpc3RpbnRhcyBlc3RpbWFjaW9uZXMNCiogJE1TJCA9IE1hc2EgU2FsYXJpYWwsIGRpc3RpbnRhcyBlc3RpbWFjaW9uZXMNCiogJENvbktmaWpvJCA9IENvbnN1bW8gZGUgQ2FwaXRhbCBGaWpvDQoNCg0KJCRDb3N0b3NcX3RvdGFsZXNcX2NvblxfR2NpYSA9IENvc3Rvc1xfdG90YWxlcyArIEdjaWFcX05vcm1hbF97aGlkcm9jYXJidXLDrWZlcmF9ICQkDQpEb25kZToNCg0KKiAkQ29zdG9zXF90b3RhbGVzXF9jb25cX0djaWEkID0gQ29zdG9zIHRvdGFsZXMgaGlkcm9jYXJidXLDrWZlcm9zIGNvbiBnYW5hbmNpYSBub3JtYWwgDQoqICRHY2lhXF9Ob3JtYWxfe2hpZHJvY2FyYnVyw61mZXJhfSQgPSBHYW5hbmNpYSBub3JtYWwgZGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybw0KDQokJCBQcmVjaW9cX2Nvc3RvID0gXGZyYWN7Q29zdG9zXF90b3RhbGVzfXtRXF90b3RhbH0gICAkJA0KRG9uZGU6DQoqICRQcmVjaW9cX2Nvc3RvJCA9IFByZWNpbyBkZSBjb3N0byBlbiBCT0UNCg0KQSBwYXJ0aXIgZGUgZXN0byBzZSBwdWVkZSBjYWxjdWxhciB1biBjb3N0byByZWN1cGVyYWJsZSBkZWwgcGV0csOzbGVvIHkgZGVsIGdhcw0KDQokJENvc3RvXF9jcnVkbyA9IFFfe3BldHLDs2xlb30gKiBQcmVjaW9cX2Nvc3RvJCQNCiQkQ29zdG9cX2dhcyA9IFFfe2dhc30gKiBQcmVjaW9cX2Nvc3RvJCQNCg0KDQokJFByZWNpb1xfcHJvZHVjY2lvbiA9IFxmcmFje0Nvc3Rvc1xfdG90YWxlc1xfY29uXF9HY2lhfXtRXF90b3RhbH0kJA0KDQokJFByZWNpb1xfdnRhXF9wb3RlbmNpYWwgPSAgXGZyYWN7UVxfdG90YWwqUGV4dF97cGV0csOzbGVvfSAtIENvc3Rvc1xfdG90YWxlc317UVxfdG90YWx9ICQkDQoNCg0KRG9uZGU6DQoqICRQcmVjaW9cX3Byb2R1Y2Npb24kPSBQcmVjaW8gZGUgcHJvZHVjY2lvbg0KKiAkUHJlY2lvX3Z0YV9wb3RlbmNpYWwkID0gUHJlY2lvIGRlIHZlbnRhIHBvdGVuY2lhbA0KKiAkUGV4dF97cGV0csOzbGVvfSQgPSBQcmVjaW8gZGUgZXhwb3J0YWNpw7NuL3JlZmVyZW5jaWEgaW50ZXJuYWNpb25hbCBkZWwgcGV0csOzbGVvIGNydWRvDQoNCmBgYHtyfQ0KI2VzdGltYWNpb24gY29zdG9zIHByb3BpYQ0KY29zdG9zIDwtIHByb2R1Y2Npb25fdG90YWwgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX3Byb2R1Y2Npb249dW5pZGFkLA0KICAgICAgICAgcHJvZHVjY2lvbl9jcnVkbyA9cHJvZF9jcnVkbywgcHJvZHVjY2lvbl9nYXM9cHJvZF9nYXMsDQogICAgICAgICBwcm9kdWNjaW9uX3RvdGFsPXByb2R1Y2Npb25fdG90YWxfYmVwKSAlPiUgDQogbGVmdF9qb2luKHN0b2NrX2VzdGltYWRvICU+JQ0KICAgICAgICAgICAgICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JQ0KICAgICAgICAgICAgICAjIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZV9lc3RpbWFkb19ib2xzYXIiKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShjb25zdW1vX2tfZmlqbyA9IHZhbG9yICogaXBjXzE4ICogY29uc3Vtb19rX2Zpam9feXBmKSAlPiUgDQogICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgY29uc3Vtb19rX2Zpam8pKSAlPiUNCiAgbGVmdF9qb2luKHZhbG9yX3RvdGFsX3Byb2R1Y2Npb24gJT4lIA0KICAgICAgICAgICAgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lIA0KICAgICAgICAgICAgICBsZWZ0X2pvaW4odGNwX2FudWFsX2IgJT4lIHNlbGVjdCgtc29icmV2YWx1YWNpb24pKSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlICVpbiUgYygiY2lfZXh0ciIsICJtc19leHRyIiksDQogICAgICAgICAgICAgICAgICAgICBmdWVudGUlaW4lIGMoIkNyaXRlcmlvIENDTk4iLCAiQ0NOTiBvZmljaWFsIiwgIkVtcGFsbWUgQ0NOTiIpKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHZhbG9yID0gKHZhbG9yKjEwXjYpKmlwY18xOC90Y2MsDQogICAgICAgICAgICAgICAgICAgICB1bmlkYWQgPSJVU0QgdGNjIikgJT4lIA0KICAgICAgICAgICAgICBzcHJlYWQoa2V5PXZhcmlhYmxlLCB2YWx1ZT12YWxvcikpICU+JSANCiAgbGVmdF9qb2luKHJlbnRhX2RpcmVjdG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgI3N0b2NrX3NlbGVjY2lvbmFkbywNCiAgICAgICAgICAgICAgICAgICAgIHBweWUsIHRnX25vcm1hbCwgcmVudGFfdG90YWwpICkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19yZWZlcmVuY2lhX2V4dGVybm8gPSBwcmVjaW9fbWVfY3J1ZG8pKSAlPiUgDQogIG11dGF0ZShwcHllID0gKHBweWUqMTBeNikqaXBjXzE4L3RjYywNCiAgICAgICAgIHJlbnRhX3RvdGFsID0gKHJlbnRhX3RvdGFsKjEwXjYpKmlwY18xOC90Y2MsDQogICAgICAgICB1bmlkYWRfY29zdG9zPSAiVVNEL2JvZSIsDQogICAgICAgICBjb3N0b3NfdG90YWxlcyA9IChjaV9leHRyICttc19leHRyICsgY29uc3Vtb19rX2Zpam8pLA0KICAgICAgICAgY29zdG9zX3RvdGFsZXNfc3VtX2djaWFfbm9ybWFsID0gY29zdG9zX3RvdGFsZXMgKyAocHB5ZSAgKiB0Z19ub3JtYWwpLA0KICAgICAgICAgcHJlY2lvX2Nvc3RvID0gY29zdG9zX3RvdGFsZXMvcHJvZHVjY2lvbl90b3RhbCwNCiAgICAgICAgIHByZWNpb19jb3N0b19tbWJ0dSA9IGNvbnZlcnNvcl9iZXBNTUJUVV9wKHByZWNpb19jb3N0byksDQogICAgICAgICBwcmVjaW9fcHJvZHVjY2lvbiA9Y29zdG9zX3RvdGFsZXNfc3VtX2djaWFfbm9ybWFsL3Byb2R1Y2Npb25fdG90YWwsDQogICAgICAgICBwcmVjaW9fdmVudGFfcG90ZW5jaWFsID0gKHByb2R1Y2Npb25fdG90YWwgKnByZWNpb19yZWZlcmVuY2lhX2V4dGVybm8gLQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3Rvc190b3RhbGVzKS9wcm9kdWNjaW9uX3RvdGFsICkNCiAgICAgICAgICMgcHJlY2lvX3ZlbnRhX3BvdGVuY2lhbCA9ICgocHB5ZSAqIHRnX25vcm1hbCkrcmVudGFfdG90YWwpL3Byb2R1Y2Npb25fdG90YWwpDQojIChwcm9kdWNjaW9uIHggcHJlY2lvIGludGVybmFjaW9uYWwgLSBjb3N0b3NfdG90YWxlcykgLyBiYXJyaWxlcyBCT0UgPSBnY2lhICsgcmVudGEgcG9yIGJhcnJpbCANCiNleHByZXNhciBlbiB1c2QgdGNjIHkgdGNwDQpjb3N0b3MNCg0KYGBgDQoNCmBgYHtyfQ0KY29zdG9zICU+JSANCiAgICAgICAgICAgZmlsdGVyKGFuaW8gPiAxOTk3KSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgcHJlY2lvX2Nvc3RvLCBjb2xvciA9IGZ1ZW50ZSkpKyANCiAgZ2VvbV9saW5lKGFscGhhID0gMC41LCBzaXplID0gMS40KSsNCiAgICBsYWJzKHRpdGxlID0gIlByZWNpbyBkZSBjb3N0byIsDQogICAgICAgICBzdWJ0aXRsZT0gIkVzdGltYWNpb24gcHJvcGlhIGEgcGFydGlyIGRlIENDTk4geSByZWVzdGltYWNpb24gZGUgVkJQIGNvbiBjcml0ZXJpbyBDQ05OIiwgDQogICAgICAgICB5ID0gIlVTRC9CT0UiLCB4ID0gIkHDsW8iKQ0KDQoNCmBgYA0KDQojIENvbXBhcmFjacOzbiBjb24gZXN0aW1hY2nDs24gZGUgb3Ryb3MgYXV0b3Jlcw0KDQpgYGB7cn0NCg0KI3JlbnRhIHVzZCB2cyBhdXRvcmVzDQojZmFsdGEgYWdyZWdhciByZW50YV9oaWRyb2NhcmJ1cm9zX2prDQpyZW50YV9hdXRvcmVzIDwtIHJlbnRhX2luZGlyZWN0byAlPiUgDQogIHNlbGVjdChhbmlvLHRjYywgdGNwLCBpcGNfMTgsIHJldGVuY2lvbmVzLCByZWdhbGlhc190b3RhbCwgY29udGFpbnMoInJlbnRhIikpICU+JSANCiAgc2VsZWN0KCAtKDEzOm5jb2woLikpKSAlPiUgDQogIGZpbHRlcihhbmlvID4gMTk2MikgJT4lDQogIG11dGF0ZSggcmV0ZW5jaW9uZXM9IHJldGVuY2lvbmVzKmlwY18xOC90Y2MsICAgICAgIA0KICAgICAgICAgIHJlZ2FsaWFzX3RvdGFsID0gcmVnYWxpYXNfdG90YWwqaXBjXzE4L3RjYywgDQogICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbyA9IHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfY3J1ZG8qaXBjXzE4L3RjcCwNCiAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyA9IHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzKmlwY18xOC90Y3AsDQogICAgICAgICAgcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfY3J1ZG8gPSByZW50YV9leHBvX3NvYnJldmFsdWFkYV9jcnVkbyppcGNfMTgvdGNwLCAgDQogICAgICAgICAgcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfZ2FzID0gcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfZ2FzKmlwY18xOC90Y3AgICwNCiAgICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbiA9IHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2NydWRvKyByZW50YV9leHBvX3NvYnJldmFsdWFkYV9nYXMsDQogICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvcyA9IA0KICAgICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMrIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfY3J1ZG8sDQogICAgICAgICAgIyByZW50YV9lbXByZXNhcyA9IHJlbnRhX2VtcHJlc2FzKmlwY18xOC90Y2MsDQogICAgICAgICAgIyByZW50YV9lbXByZXNhc19kZXNwX2ltcHVlc3RvcyA9IHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zKmlwY18xOC90Y2MsDQogICAgICAgICAgcmVudGFfdG90YWwgPSAocmVudGFfdG90YWwqaXBjXzE4KSAvIHRjcCwNCiAgICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgVVNEIiwNCiAgICAgICAgIGF1dG9yID0gIlByb3BpYSIpICU+JSANCiAgcmVuYW1lKHJldGVuY2lvbmVzID0gcmV0ZW5jaW9uZXMsDQogICAgICAgICByZWdhbGlhcyA9IHJlZ2FsaWFzX3RvdGFsDQogICAgICAgICAgIyByZW50YV9lbXByZXNhcyA9IHJlbnRhX2VtcHJlc2FzX2Rlc3BfaW1wdWVzdG9zLA0KICAgICAgICAgIyByZW50YV90b3RhbF9nYXMgPSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcywNCiAgICAgICAgICMgcmVudGFfdG90YWxfY3J1ZG8gPSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvLA0KICAgICAgICAgKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGF1dG9yLCBldmVyeXRoaW5nKC4pLCANCiAgICAgICAgIC1jKGlwY18xOCwgdGNjLCB0Y3AsIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2NydWRvLCByZW50YV9leHBvX3NvYnJldmFsdWFkYV9nYXMsDQogICAgICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcywgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbykpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fZGVfcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgNDpuY29sKC4pKSAlPiUgDQogICAgYmluZF9yb3dzKHJlbnRhX2F1dG9yZXMpDQojIyMjIw0KDQoNCiNncmFmaWNvIGNvbXBhcmFjaW9uIGNvbiBvdHJvcyBhdXRvcmVzDQpncmFmX3RpcG9zX3JlbnRhIDwtIHJlbnRhX2F1dG9yZXMgJT4lIA0KICBmaWx0ZXIoISh0aXBvX2RlX3JlbnRhJWluJSBjKCJyZW50YV90b3RhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVudGFfZXN0YWRvX3RvdGFsIikpKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gYXV0b3IpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoc2l6ZSA9IDAuNSkrDQogIGZhY2V0X3dyYXAofnRpcG9fZGVfcmVudGEsIHNjYWxlcyA9ICJmcmVlX3kiKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkNvbXBhcmFjacOzbiBkZSBlc3RpbWFjaW9uZXMuIE1pbGxvbmVzIFVTRCIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmdncGxvdGx5KGdyYWZfdGlwb3NfcmVudGEsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApICANCg0KDQoNCmdyYWZfcmVudGFfdG90YWxfY29tcGFyYWNpb24gPC0gcmVudGFfYXV0b3JlcyAlPiUgDQogICMgZmlsdGVyKCEoYXV0b3IgPT0gIlByb3BpYSIgJiB0aXBvX2RlX3JlbnRhID09ICJyZW50YV90b3RhbCIpKSAlPiUNCiAgIyBtdXRhdGUodGlwb19kZV9yZW50YT0gY2FzZV93aGVuKHRpcG9fZGVfcmVudGEgPT0icmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvcyIgJg0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvciA9PSAiUHJvcGlhIiB+ICJyZW50YV90b3RhbCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdGlwb19kZV9yZW50YSkpICU+JQ0KICBmaWx0ZXIodGlwb19kZV9yZW50YSA9PSAicmVudGFfdG90YWwiKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gYXV0b3IpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIChwZXRyw7NsZW8geSBnYXMpIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29uIHJlbnRhIHRvdGFsIHByb3BpYSBtZXRvZG9sb2fDrWEgYXV0b3JlcyIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbih4KSBmb3JtYXQoeCwgYmlnLm1hcmsgPSAiLiIsIHNjaWVudGlmaWMgPSBGQUxTRSkpDQpncmFmX3JlbnRhX3RvdGFsX2NvbXBhcmFjaW9uDQoNCmdncGxvdGx5KGdyYWZfcmVudGFfdG90YWxfY29tcGFyYWNpb24sIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQojIGdncGxvdGx5KGdyYWZfcmVudGFfdG90YWxfY29tcGFyYWNpb25fYikNCg0KYGBgDQoNCiMgRXhwb3J0YWNpb24gZGUgcmVzdWx0YWRvcw0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMjIEV4cG9ydGFjacOzbiBkZSByZXN1bHRhZG9zDQoNCndyaXRleGw6OndyaXRlX3hsc3gobGlzdChwcm9kdWNjaW9uX2NydWRvID0gcHJvZF9tZXJnZV9jcnVkbywgDQogICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2ludGVybm9fY3J1ZG8gPSBwcmVjaW9fbWlfY3J1ZG8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGFjaW9uX2NydWRvID0gZXhwb19xX2NydWRvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9zX2V4dGVybm9fY3J1ZG8gPSBwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2Npb25fZ2FzID0gcHJvZF9tZXJnZV9nYXNfTU1CVFUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19pbnRlcm5vX2dhcyA9cHJlY2lvX2ludGVybm9fZ2FzX21tYnR1X3VzZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0YWNpb25fZ2FzID0gZXhwb19xX2dhcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4dGVybm9fZ2FzID0gcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNpZGlvcyA9c3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgZ2FuYW5jaWFfeV9wYmkgPSBnYW5hbmNpYV95X3BiaSwNCiAgICAgICAgICAgICAgICAgICAgICAgICB0aXBvX2NhbWJpbyA9IHRjcF9hbnVhbF9iLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGlwYyA9IGlwY19wcm9tZWRpbyksDQogICAgICAgICAgICAgICAgICAgIHBhdGggPSAgInJlc3VsdGFkb3MvYXJnZW50aW5hL3ZhcmlhYmxlcy54bHN4IikNCg0KY29lZmljaWVudGVzIDwtIGxpc3QoIlByb3BvcmNpw7NuIGRlIGxvcyBzZXJ2aWNpb3Mgc29icmUgZXh0cmFjY2lvbiIgPSBzZXJ2aWNpb19zX2V4dHJhY2Npb24sDQogICAgICAgICAgICAgICAgICAgICAiVGFzYSBkZSBkZXByZWNpYWNpw7NuIGRlIFlQRiIgPSBjb25zdW1vX2tfZmlqb195cGYsDQogICAgICAgICAgICAgICAgICAgICAiSW1wdWVzdG9zIHByb21lZGlvcyBNSVAgOTciID0gaW1wX3Byb21fOTcsDQogICAgICAgICAgICAgICAgICAgICAiQ29lZmljaWVudGUgdGVjbmljbyBNSVAgOTciID0gY29lZl90ZWNuaWNvXzk3LA0KICAgICAgICAgICAgICAgICAgICAgIlByb3BvcmNpw7NuIGRlIGxhIE1hc2EgU2FsYXJpYWwgdG90YWwgcHJvbWVkaW8gMjAwNC0yMDEyIj0gbWVhbl9jb2VmX21zJGNvZWZfbXNfdG90LA0KICAgICAgICAgICAgICAgICAgICAgIlByb3BvcmNpw7NuIGRlIGxhIE1hc2EgU2FsYXJpYWwgZXh0cmFjY2lvbiBwcm9tZWRpbyAyMDA0LTIwMTIiPSBtZWFuX2NvZWZfbXMkY29lZl9tc19leHRyKQ0KDQpjYXB0dXJlLm91dHB1dChjb2VmaWNpZW50ZXMsIGZpbGUgPSAicmVzdWx0YWRvcy9hcmdlbnRpbmEvY29lZmljaWVudGVzLnR4dCIpDQoNCndyaXRleGw6OndyaXRlX3hsc3gobGlzdChtZXRvZG9faW5kaXJlY3RvID0gcmVudGFfaW5kaXJlY3RvWyxjKDE6MTMsIDE3KV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZG9fZGlmX3ByZWNpb3NfbXMgPSByZW50YV9kaWZfcHJlY2lvc19jcnVkb1ssLTE0XSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgZ2FzX2RpZl9wcmVjaW9zX21zID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXNbLC0xM10sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkb19zb2JyZXZhbHVhY2lvbl9tcyA9IHJlbnRhX3RjcF9jcnVkb1ssLWMoMTI6MTMpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhc19zb2JyZXZhbHVhY2lvbl9tcyA9IHJlbnRhX3RjcF9nYXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgcmVnYWxpYXMgPSByZWdhbGlhc191c2QsDQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0ZW5jaW9uZXMgPSByZXRlbmNpb25lc19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzaWRpb3MgPSBzdWJzaWRpb3NfaGlkcm9jYXJidXJvcywNCiAgICAgICAgICAgICAgICAgICAgICAgICByZW50YV9iYWxhbmNlcyA9IHJlbnRhX3Byb2R1Y2Npb25fYmFsYW5jZXMgICksIA0KICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvYXJnZW50aW5hL3JlbnRhX21ldG9kb19pbmRpcmVjdG8ueGxzeCIpDQoNCg0Kd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KHZhX2NyaXRlcmlvX3Byb3BpbyA9IGNyaXRlcmlvX3Byb3BpbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0b2RvX2RpcmVjdG8gPSByZW50YV9kaXJlY3RvKSwNCiAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2FyZ2VudGluYS9yZW50YV9tZXRvZG9fZGlyZWN0by54bHN4IikNCg0Kd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KCBtZXRvZG9fZGlyZWN0b19wYmkgPSByZW50YV9kaXJlY3RvX3BiaVssYygxLDE0OjE1KV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgbWV0b2RvX2luZGlyZWN0b19wYmk9cmVudGFfaW5kaXJlY3RvWyxjKDEsMTk6MjApXSksDQogICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9hcmdlbnRpbmEvcmVudGFfc29icmVfcGJpLnhsc3giKQ0KDQp3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoY2Nubl9vZmljaWFsID0gY2Nubl9vZmljaWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvX2Njbm49Y3JpdGVyaW9fY2NubiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBlbXBhbG1lX2Njbm49ZW1wYWxtZV9jY25uLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvX3Byb3BpbyA9Y3JpdGVyaW9fcHJvcGlvKSwNCiAgICAgICAgICAgICAgICAgICAgcGF0aD0gIi9BcmNoaXZvcy9yZXBvcy9oaWRyb2NhcmJ1cm9zL2FuYWxpc2lzL3Jlc3VsdGFkb3MvYXJnZW50aW5hL3ZhbG9yX3RvdGFsX3Byb2R1Y2Npb24ueGxzeCIpDQoNCg0Kd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KGNvbXBhcmFjaW9uX2F1dG9yZXMgPSByZW50YV9hdXRvcmVzKSwNCiAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2FyZ2VudGluYS9yZW50YV9jb21wYXJhY2lvbl9hdXRvcmVzLnhsc3giKQ0KDQoNCndyaXRleGw6OndyaXRlX3hsc3gobGlzdCggInJlbnRhIGVtcHJlc2FzIiA9IHJlbnRhX2VtcHJlc2FzX2JhbGFuY2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvY2tfYmFsYW5jZXMgPSBzdG9ja19iYWxhbmNlc19lbXByZXNhcywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50b19ZUEZfUGV0QlIgPXVuaW9uX3NlZ21lbnRvcyksIA0KICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvYXJnZW50aW5hL3N0b2NrLCB0ZyB5IHJlbnRhIGVtcHJlc2FzIGFyZ2VudGluYS54bHN4IikNCg0Kd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KGNvc3Rvc19jY25uPWNvc3RvcyksDQogICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9hcmdlbnRpbmEvY29zdG9zX2Njbm4ueGxzeCIpDQoNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QocHJvZHVjY2lvbiA9IHByb2RfbWVyZ2VfY3J1ZG8sIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0YWNpb25lcyA9IGV4cG9fcV9jcnVkbywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0ZW5jaWFzID0gZXhpc3RlbmNpYXNfcGV0cm9sZW8sIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2ludGVybm8gPSBwcmVjaW9fbWlfY3J1ZG8sIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4dGVybm8gPSBwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwID0gdGNwX2FudWFsX2IsDQojICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxvID0gcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8pLCANCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkby54bHN4IikNCiMgDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdChwcm9kdWNjaW9uID0gcHJvZF9tZXJnZV9nYXNfTU1CVFUsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0YWNpb25lcyA9IGV4cG9fcV9nYXNfTU1CVFUsDQojICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9faW50ZXJubyA9IHByZWNpb19taV9nYXNfTU1CVFUsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4dGVybm8gPSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUsDQojICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AgPSB0Y3BfYW51YWxfYiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bG8gPSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyksIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9yZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcy54bHN4IikNCiMgIyANCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KCJjb24gcG96b3MgcGVyZm9yYWRvcyBwb3IgYcOxbyI9IHN0b2NrX2VzdGltYWRvLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICJjb24gc3RvY2sgZGUgcG96b3MiID0gZWplcmNpY2lvX2ZkX3N0b2NrLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgImEgcGFydGlyIFlQRiAoZmx1am8pIiA9IGVqZXJjaWNpb19mZF95cGYpLCANCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvZXN0aW1hY2lvbiBkZSBzdG9jayBhIHBhcnRpciBkZSBwb3pvcy54bHN4IikNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoImNvbiBwb3pvcyBwZXJmb3JhZG9zIHBvciBhw7FvIj0gc3RvY2tfeV9wb3pvcyksIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9lc3RpbWFjaW9uIGRlIHN0b2NrIGEgcGFydGlyIGRlIHBvem9zLnhsc3giKQ0KDQojIA0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoImZsdWpvIj0gY29tcGFyYWNpb25fcG96b3MsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAiZmx1am9fdG90YWwiPSBsaXN0YWRvX3Bvem9zLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgInN0b2NrIiA9IHBvem9zX2lhcGdfY2VudGVuYXJpbyksIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9hcmdlbnRpbmEvcG96b3MueGxzeCIpDQojIA0KIyANCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KGFmaXAgPSBzdG9ja19hZmlwLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZXNfYm9sc2FyID0gc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMsDQojICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50b19ZUEZfUGV0QlIgPXVuaW9uX3NlZ21lbnRvcywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbHNhcl92MiA9IHN0b2NrX2JhbGFuY2VzX3JhbWEsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52ZXJzaW9uIHBvciBwb3pvIChJQVBHKSIgPSBpbnZlcnNpb25fcG96b3MsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmVyc2lvbiBwb3IgcG96byAoQ2FwIElWKSI9IGludmVyc2lvbl9wb3pvc19jYXBpdiksDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2FyZ2VudGluYS9zdG9ja19wZXRyb2xlby54bHN4IikNCiMgDQoNCg0KDQpwcmludCgiRWwgY8OzZGlnbyB0ZXJtaW7DsyBkZSBjb3JyZXIiKQ0KDQpgYGANCg0KDQoNCg0KDQoNCg0K